C++ プロジェクト - 従業員管理システム

目次

 

序文

1. 管理システム要件

2. 管理システムに実装する必要がある機能は次のとおりです。

次に、管理クラスを作成します

2.1 ファイルを作成する

2.2 ヘッダファイルの実装

2.3 ソースファイルの実現

 3. メニューを作成する

4. システムを終了します 

5. 従業員クラスを作成する

5.1 ワーカー抽象クラスの作成

 5.2 共通の従業員クラスの作成

6. 従業員を追加する

6.1 機能分析

7. ファイルのやり取り 

7.1 ファイルの書き込み

7.2 ファイルの読み込み 

7.1.1 ファイルが作成されない

 7.1.2 ファイルは存在するがデータが空である

7.1.3 ファイルが存在し、データが存在する

 7.3 配列の初期化

8. 従業員に見せる

9. 従業員の削除 

10. 従業員の変更

11. 従業員を探す

12. 仕分け 

13、ファイルをクリアする

要約する


序文

1. 管理システム要件

従業員管理システムを利用することで、全従業員の情報を管理することができます。

このチュートリアルでは主に C++ を使用して、ポリモーフィック ベースの従業員管理システムを実装します。

企業内の従業員は一般社員、管理職、上司の3つに分類されており、情報を表示する際には社員番号、社員名、社員の役職、責任などを表示する必要があります。                                                                                                                         

一般社員の責任:上司から与えられた業務を遂行する 管理者
の責任:上司から指示された業務を遂行し、従業員に課題を与える
上司の責任:会社の業務全般を管理する

2. 管理システムに実装する必要がある機能は次のとおりです。

1. 管理プログラムを終了します:現在の管理システムを終了します
2. 従業員情報を追加します:従業員をバッチで追加する機能を実現し、情報をファイルに入力します 従業員情報は: 従業員番号、名前、部門番号です 3.                                                                                                                                                表示従業員情報:社内の全情報を表示 従業
員情報 4. 退職者削除:番号に従って指定された従業員を削除 従業員情報変更:番号に従って従業員の個人情報を変更 5.従業
員情報検索:該当する人事情報を検索並び                                      替え:社員番号順に並び替え、並び替えルールはユーザーが指定
7. ファイル全クリア:ファイルに記録されている社員情報を全てクリアします(クリアする前に再度確認が必要です)誤削除防止)


1. プロジェクトを作成する

VS2022で新規プロジェクトを作成します 作成方法は以前に書いた記事「VS2022の簡単セットアップ」を参照してください。

次に、管理クラスを作成します

管理クラスは以下を担当します。

1. ユーザーとのコミュニケーションメニューインターフェイス

2. 従業員の追加・削除・変更・確認の操作

3. ファイルの読み取りと書き込みの対話

2.1 ファイルを作成する

ヘッダー ファイル フォルダーとソース ファイル フォルダーの下に、workerManager.h ファイルと workManager.cpp ファイルをそれぞれ作成します。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.2 ヘッダファイルの実装

#pragma once
#include<iostream>
using namespace std;
class WorkerManager
{
public:
    //构造函数
    WorkerManager();
    //析构函数
    ~WorkerManager();
};

2.3 ソースファイルの実現

#include"workerManager.h"
WorkerManager::WorkerManager()
{
}
WorkerManager::~WorkerManager()
{
}

 3. メニューを作成する

機能: ユーザーと通信するためのインターフェイス。

WorkerManager.cpp の下に WorkerManager のメニュー メンバー関数を作成します。

void WorkerManager::menu()
{
	cout << "*******************************************" << endl;
	cout << "**********欢迎使用职工管理系统!************" << 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;
}

4. システムを終了します 

分岐選択は main 関数で提供され、各機能インターフェイスを提供します。

スイッチのケース 0: システムを終了するには、以下に return 0 を追加します。

5. 従業員クラスを作成する

5.1 ワーカー抽象クラスの作成

従業員は一般社員、管理職、上司に分類されます。

3 種類のワーカーを 1 つのクラス (ワーカー)に抽象化し、ポリモーフィズムを使用して異なる種類のワーカーを管理します

従業員の属性は、従業員番号、従業員名、従業員部門番号です。

従業員の行動は次のとおりです:職務上の責任情報を説明し、役職を取得する

ヘッダー ファイル フォルダーの下に worker.h ファイルを作成し、次のコードを追加します。

#pragma once
#include<iostream>
using namespace std;
class worker//职工抽象基类
{
public:
	//显示个人信息
	virtual void perinf() = 0;
	//岗位信息
	virtual string jobname() = 0;
	int m_id;
	string m_name;
	int m_depid;
};

 5.2 共通の従業員クラスの作成

通常の従業員クラスは従業員抽象クラスを継承し親クラスの純粋仮想関数を書き換え、ヘッダーファイルとソースファイルのフォルダー下にそれぞれjob.hファイルとjob.cppファイルを作成します。

job.hヘッダーファイルにemployeeサブクラスの関数宣言を記述します。

using namespace std;
#include<string>
#include"work.h"
//在这里仅作为员工的声明
class employee :public worker
{
public:
	//构造函数
	employee(int id,string name,int depid);
	//显示个人信息
	void perinf();
	//岗位信息
	string jobname();
};

job.cpp ソース ファイルに関数の特定の実装を記述します。

#include"job.h"
//普通员工类
//构造函数
employee::employee(int id, string name, int depid)
{
	this->m_id = id;//这里不加this也可以,因为编译器在类的成员函数中自动用this指针
	this->m_name = name;
	this->m_depid = depid;
}
//显示个人信息
void employee::perinf()
{
	cout << "职工编号:" << this->m_id
		<< "\t职工姓名:" << this->m_name
		<< "\t岗位:" << this->jobname()
		<<"\t岗位职责:完成经理交给的任务。"<<endl;
}
//获取岗位名称
string employee::jobname()
{
	return string("员工");
}

同様に、manager クラスと Boss クラスを作成できます。

6. 従業員を追加する

機能説明: 従業員を一括で追加し、ファイルに保存します。

6.1 機能分析

分析: ユーザーがバッチで作成する場合、さまざまなタイプの従業員を作成する可能性があります。さまざまな種類の従業員をすべて配列に入れたい場合は、すべての従業員のポインタを配列に保持することができます。この可変長配列をプログラム内で保持したい場合は、ヒープ領域に配列を作成し、Worker** のポインタを使用して保持することができます。

 work** : 二次ポインタ、ポインタからポインタへ。

        まず、workerManager.hのWorkerManagerクラスに、従業員数を記録するメンバ属性int m_EmpNum、ワーカー配列ポインタworker** m_Emparray、メンバ関数宣言void add_emp();を追加し、このadd_emp()関数を使用します。ワーカー操作を追加します。

        次に、特定の実装を workManager.cpp に記述します。まず、クラスの外部で属性を初期化します。スコープを追加する必要があります。this ポインタを使用してメンバー属性をポイントし、初期値を割り当てます。コードは以下のように表示されます:

WorkerManager::WorkerManager()
{
	//初始化属性
	this->m_EmpNum = 0;
	this->m_Emparray = NULL;
}

        次に、従業員を追加する関数 add_emp() の実装の記述を開始します。同様に、この関数は、ユーザー数を保存するために使用される "WorkerManager::" のスコープの下に整数変数 addnum も定義する必要があります。addnum > 0 の場合、従業員数を追加し、追加された新しいスペースのサイズを計算し、新しい従業員数を格納する新しい整変数 newsize を定義し、int newsize = this->m_EmpNum + addnum を設定します。ポインターの配列への新しいポインター work**newspace = new worker * [newsize] を開きます。次に、元のスペースのデータを新しいスペースにコピーし (上の図の大きなボックス内の親クラス オブジェクトの各小さなボックスにサブクラス オブジェクトを保存するのと同じです)、ユーザーがデータを追加するコマンドを記述します。作成した従業員ポインタを配列 newspace に保存し、最後に元のスペースを解放し、ポインタを新しいスペースに変更し、新しい従業員数を更新して、追加が成功したことを示すプロンプトを表示する必要があります。以下はコードです:

//添加职工
void WorkerManager::add_emp()
{
	cout << "请输入添加职工的数量: " ;
	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];
			}
		}
		int m_id;//职工编号
		string m_name;//职工姓名
		int m_depid;//职工所在部门名称编号
		//批量添加新数据
		for (int i = 0; i < addnum; i++)
		{
			cout << "请输入第" << i + 1 << "个新职工的编号:";
			while (1)
			{
				int a = 0;
				cin >> m_id;
				for (int i = 0;i < this->m_EmpNum;i++)
				{
					if (m_id == this->m_Emparray[i]->m_id)
					{
						cout << "编号已经存在,请重新输入编号。" << endl;
						a = 1;
					}
				}
				if (a == 0)
				{
					break;
				}
			}
			cout << "请输入第" << i + 1 << "个新职工的姓名:";
			cin >> m_name;
			cout << "请输入第" << i + 1 << "个新职工的岗位(1.员工 2.经理 3.老板):";
			cout << endl;
			worker* wk = NULL;
			again:cin >> m_depid;
			switch (m_depid)
			{
			case 1:
				wk = new employee(m_id, m_name, 1);
				break;
			case 2:
				wk = new manager(m_id, m_name, 2);
				break;
			case 3:
				wk = new boss(m_id, m_name, 3);
				break;
			default:
				cout << "非法输入请重新输入" << endl;
				goto again;
				break;
			}	
			//将创建的职工指针,保存到数组newspace中
			newspace[this->m_EmpNum + i] = wk;
		}
		//释放原有空间
		delete[] this->m_Emparray;
		//更改新空间的指向
		this->m_Emparray = newspace;
		//更新新的职工人数
		this->m_EmpNum = newsize;
		//更新职工不为空的标志
		this->m_FilelsEmpty = false;
		//提示添加成功
		cout << "添加"<<addnum<<"名新员工成功" << endl;
		//保存数据到文件中
		this->save();
	}
	else
	{
		cout << "输入有误,请重新输入" << endl;
	}
	system("pause");
	system("cls");
}

 最後に、~WorkerManager() デストラクター内のメモリを解放し、ポインターを null ポインターに設定します。

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

7. ファイルのやり取り 

機能説明: ファイルの読み取りと書き込み

最後の追加関数では、すべてのデータをメモリに追加しましたが、プログラムが終了するとデータを保存することはできません。したがって、ファイル管理クラスには、ファイルと対話し、ファイルを読み書きするための関数が必要です。 

7.1 ファイルの書き込み

まず、ファイルパスを追加し、workerManager.h にマクロ定数を追加し、ヘッダーファイル fstream をインクルードし、workerManager.h のクラスにメンバー関数 void save() を追加し、workerManager に save() の実装を記述します。 CP。

//保存文件
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 << "\t"
			<< this->m_Emparray[i]->m_name << "\t"
			<< this->m_Emparray[i]->m_depid << "\t";
	}
	//关闭文件
	ofs.close();
}

7.2 ファイルの読み込み 

機能の説明:ファイルの内容をプログラムに読み込みます。

従業員を追加した後にファイルに保存する操作を実装しましたが、プログラムが実行を開始するたびに、ファイル内のデータがプログラムに読み込まれないため、プログラム関数は依然としてファイルをクリアする必要があります。したがって、コンストラクターがデータを初期化する状況は 3 つあります。

1. 初めて使用する場合、ファイルは作成されません

2. ファイルは存在しますが、データはユーザーによって消去されます

3. ファイルが存在し、すべての従業員データが保存されています

7.1.1 ファイルが作成されない

workerManager.h に新しいメンバー属性 m_FilelsEmpty を追加して、ファイルが空かどうかをマークし、コンストラクター WorkerManager::WorkerManager() に次のコードを記述します。

//1.文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件
	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		//初始化属性
		this->m_EmpNum = 0;
		this->m_Emparray = NULL;
		this->m_FilelsEmpty = true;
		ifs.close();
		return;
	}

 7.1.2 ファイルは存在するがデータが空である

//2.文件存在 数据为空
	char ch;
	ifs>> ch;
	if (ifs.eof())
	{
		cout << "文件为空" << endl;
		//初始化属性
		this->m_EmpNum = 0;
		this->m_Emparray = NULL;
		this->m_FilelsEmpty = true;
		ifs.close();
		return;
	}

7.1.3 ファイルが存在し、データが存在する

workerManager.h にメンバー関数 int get_EmpNum() を追加します。 

workerManager.cppに実装されています。

まず、ファイル内の情報を再読み取る必要があります。ファイル内の人数を読み取り、ファイル内の人数を読み取る関数 get_empnum() を定義します。getline() 関数を通じて行を読み取ることができ、各行が人を表します。

//统计文件中的人数
int WorkerManager::get_empnum()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//打开文件 读文件
	string buf;
	int count=0;
	while (getline(ifs,buf))
	{
		count++;
	}
	return count;
}

 この時点で、3 番目のケースは WorkerManager() コンストラクターで実現でき、ファイルが存在し、データが含まれています。また、m_EmpNum の人数も更新します。

//3.文件存在,并且有数据
	int num = this->get_empnum();
	cout << "职工的人数为:" << num << endl;
	this->m_EmpNum = num;

 7.3 配列の初期化

WorkerManager.h にメンバー関数を追加します。 void init_Emp() は配列の初期化に使用されます。その目的は、既存のファイル データがある場合にプログラムに既存のファイルのデータを読み取らせ、それを初期データとしてロードさせることです。

//初始化职工(为了让程序读取已有文件的数据,把它加载出来作为初始数据)
void WorkerManager::init_Emp()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	int id;
	string name;
	int did;
	int count=0;
	while (ifs >> id && ifs >> name && ifs >> did)//利用右移运算符读取每一行
	{
		worker* worker = NULL;
		if (did == 1)
		{
			worker = new employee(id, name, did);
		}
		else if (did == 2)
		{
			worker = new manager(id, name, did);
		}
		else if (did == 3)
		{
			worker = new boss(id, name, did);
		}
		this->m_Emparray[count] = worker;
		count++;
	}
	//关闭文件
	ifs.close();
}

8. 従業員に見せる

機能: 現在の従業員情報をすべて表示します。

workManager.hにメンバ関数 void show_Emp()を追加; workerManager.cppに関数の実装を記述し、まずファイルが空かどうかを判定し、空でなければ個人情報表示関数:perinf()を呼び出します。

//显示职工
void WorkerManager::show_emp()
{
	//判断文件是否为空
	if (this->m_FilelsEmpty)
	{
		cout << "文件不存在" << endl;
	}
	else 
	{
		for (int i = 0; i < this->m_EmpNum; i++)
		{
			//利用多态调用程序接口
			this->m_Emparray[i]->perinf();
		}
	}
	system("pause");
	system("cls");
}

9. 従業員の削除 

機能の説明: 従業員を番号に従って削除します。

        workManager.h にメンバ関数を追加 workManager.h にメンバ関数 void Del_Emp( ) を追加し、まずファイルが存在するかどうかを判定し、存在する場合は入力された社員番号が存在するかどうかを判定します。次に、workerManager.h にメンバー関数 int ifexit(int id) を追加し、workerManager.cpp に実装を記述し、int インデックスが存在する場合は従業員配列内の位置を返し、存在しない場合は -1 を返します。最後にインデックスを返します。

//判断职工是否存在
int WorkerManager::ifexit(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;
}

        workerManager.cppに削除関数Del_Emp()の実装を記述し、上記ファイルが空であるか、入力された従業員が存在するかを判断し、存在する場合は削除し、削除はデータ前方上書きを使用します。最後に、配列内の人数を更新する必要があり、データは同期的にファイルに更新されます。

//删除职工
void WorkerManager::Del_Emp()
{
	if (this->m_FilelsEmpty)
	{
		cout << "文件为空" << endl;
	}
	else
	{
		int id = 0;
		cout << "请输入要删除的员工编号:";
		cin >> id;
		int index = this->ifexit(id);
		if (index == -1)
		{
			cout << "职工不存在" << endl;
		}
		else
		{
			//做数据前移覆盖作为删除
			for (int a = index; a < this->m_EmpNum-1; a++)
			{
				this->m_Emparray[a] = this->m_Emparray[a + 1];
			}
			cout << "删除成功" << endl;
			this->m_EmpNum--;//更新数组中的人员数
			this->save();//数据同步更新到文件中
		}
	}
	system("pause");
	system("cls");
}

10. 従業員の変更

        workerManager.hにワーカーを変更する機能を追加、 void mod_emp(); 実装をworkerManager.cppに書きます。同じように、最初にファイルが空かどうかを判断し、変更する従業員番号を入力してから従業員が存在するかどうかを判断します。最後に、配列内の人数が更新され、データが同期的にファイルに更新されます。

//修改职工
void WorkerManager::mod_emp()
{
	if (this->m_FilelsEmpty)
	{
		cout << "文件为空" << endl;
	}
	else
	{
		cout << "请输入需要修改的职工编号" << endl;
		int id;
		cin >> id;
		int ret = this->ifexit(id);
		if (ret == -1)
		{
			cout << "查无此人" << endl;
		}
		else
		{
			delete this->m_Emparray[ret];
			int newid = 0;
			string newname="";
			int newdid = 0;
			cout << "请输入新的ID号:";
			cin >> newid;
			cout << "请输入新的姓名:";
			cin >> newname;
			cout << "请输入新的岗位(1.职工 2.经理 3.老板):";
			again:cin >> newdid;
			worker* wk = NULL;
			switch (newdid)
			{
			case 1:
				wk = new employee(newid, newname, 1);
				break;
			case 2:
				wk = new manager(newid, newname, 2);
				break;
			case 3:
				wk = new boss(newid, newname, 3);
				break;
			default:
				cout << "非法输入请重新输入" << endl;
				goto again;
				break;
			}
			//更新数据到数组中
			this->m_Emparray[ret] = wk;
			cout << "修改成功!" << endl;
			//保存文件
			this->save();
		}
	}
	system("pause");
	system("cls");
}

11. 従業員を探す

        従業員の検索 function voidfine_emp(); 2 つの検索方法が提供されます: 1. 従業員番号で検索します。2. 従業員名で検索します。同じように、最初にファイルが空かどうかを判断し、検索する従業員番号または名前を入力して、次に員が存在するかどうかを判断し、最後に perinf() 関数を呼び出して従業員を表示します。ここでは、スイッチ選択ステートメントを使用して、どの検索方法であるかを決定します。ループトラバーサルを使用して、番号または名前が存在するかどうかを確認します。ここでは、入力を間違えた後に検索方法に戻って再選択するために、デフォルトで goto コマンドを使用しています。
 

//查找员工
void WorkerManager::fine_emp()
{
	if (this->m_FilelsEmpty)
	{
		cout << "文件为空" << endl;
	}
	else
	{
		cout << "请输入要查找的方式" << endl;
		cout << "1.按职工编号查找" << endl;
		cout << "2.按职工姓名查找" << endl;
		cout << "请输入:";
		int a = 0;
		again:cin >> a;
		switch (a)
		{
			case 1:
			{
				cout << "请输入需要修改的职工编号: ";
				int id;
				cin >> id;
				int ret = this->ifexit(id);
				if (ret == -1)
				{
					cout << "查无此人" << endl;
				}
				else
				{
					this->m_Emparray[ret]->perinf();
				}
				break;
			}
			case 2:
			{
				cout << "请输入需要修改的职工姓名: ";
				string name;
				cin >> name;
				bool flag = false;
				for (int i = 0; i < this->m_EmpNum; i++)
				{
					if (name == this->m_Emparray[i]->m_name)
					{
						this->m_Emparray[i]->perinf();
						flag = true;
					}
				}
				if (flag == false)
				{
					cout << "查无此人" << endl;
				}
				break;
			}
			default:
				cout << "非法输入请重新输入" << endl;
				goto again;
		}
	}
	system("pause");
	system("cls");
}

12. 仕分け 

機能説明: 従業員番号順に並べ替えます。

ここでは選択ソート アルゴリズムが使用されており、最大 (最小) ID 番号を持つ配列番号を想定し、配列のすべての ID 番号とそのサイズを調べ、より大きい (小さい) ID 番号がある場合はシリアル番号を交換します。最後にファイルを保存します。

//对编号排序
void WorkerManager::sort_emp()
{
	if (this->m_FilelsEmpty)
	{
		cout << "文件为空" << endl;
	}
	else
	{
		cout << "请输入排序的方式" << endl;
		cout << "1.按职工编号升序" << endl;
		cout << "2.按职工编号降序" << endl;
		cout << "请输入:";
		int a = 0;
		again:cin >> a;
		switch (a)
		{
		case 1:
		{
			for (int i = 0; i < m_EmpNum; i++)
			{
				int min = i;
				for (int j = i + 1; j < m_EmpNum; j++)
				{
					if (m_Emparray[min]->m_id > m_Emparray[j]->m_id)
					{
						min = j;
					}
				}
				if (min != i)
				{
					worker* temp = this->m_Emparray[i];
					this->m_Emparray[i] = this->m_Emparray[min];
					this->m_Emparray[min] = temp;
				}
			}
			break;
		}
		case 2:
		{
			for (int i = 0; i < m_EmpNum; i++)
			{
				int max = i;
				for (int j = i + 1; j < m_EmpNum; j++)
				{
					if (m_Emparray[max]->m_id < m_Emparray[j]->m_id)
					{
						max = j;
					}
				}
				if (max != i)
				{
					worker* temp = this->m_Emparray[i];
					this->m_Emparray[i] = this->m_Emparray[max];
					this->m_Emparray[max] = temp;
				}
			}
			break;
		}
		default:
			cout << "非法输入请重新输入:" ;
			goto again;
	}
	cout << "排序成功" << endl;
	this->save();
	}
    system("pause");
	system("cls");
}

13、ファイルをクリアする

 ファイルをクリアするときは、メモリを解放する必要があり、ポインタは空に設定され、数値は 0 に設定されます。

//清空文件
void WorkerManager::clean_file()
{
	cout << "是否确定清空文件(1.是 0.否):" ;
	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_FilelsEmpty=true;
		}
		cout << "清空成功" << endl;
	}
	system("pause");
	system("cls");
}

workerManager.h ヘッダー ファイルから宣言を添付します。

#pragma once
#include<iostream>
using namespace std;
#include "worker.h"
#include"job.h"
#include<fstream>
#include<string>
#define FILENAME "empfile.txt"
class WorkerManager
{
public:
	//构造函数
	WorkerManager();
	//菜单
	void menu();
	//记录职工人数
	int m_EmpNum;
	//职工数组指针
	worker** m_Emparray;
	//1.添加职工
	void add_emp();
	//保存文件
	void save();
	//判断文件是否为空 
	bool m_FilelsEmpty;
	//统计文件中的人数
	int get_empnum();
	//初始化职工
	void init_Emp();
	//显示职工
	void show_emp();
	//删除职工
	void Del_Emp();
	//判断职工是否存在
	int ifexit(int id);//存在返回职工数组中的位置,不存在返回-1
	//修改职工
	void mod_emp();
	//查找员工
	void fine_emp();
	//对编号排序
	void sort_emp();
	//清空文件
	void clean_file();
	//析构函数
	~WorkerManager();
};

最後に、main() 関数を含む test.cpp のテスト コードを添付します。 

#include<iostream>
using namespace std;
#include"workerManager.h"
#include"worker.h"
#include"job.h"
int main()
{
	//调用菜单成员函数
	int ret = 0;
	while (1)
	{
		wm.menu();
		cout << "请输入您的选择:" ;
		cin >> ret;
		switch (ret)
		{
		case 0://退出系统
			return 0;
			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.fine_emp();
			break;
		case 6://按照编号排序
			wm.sort_emp();
			break;
		case 7://清空所有文档
			wm.clean_file();
			break;
		default:
			cout << "非法输入请重新输入" << endl;
			system("pause");
			system("cls");
			break;
		}
	}
	system("pause");
	return 0;
}

要約する

        このプロジェクトでは、C++ のカプセル化、継承、ポリモーフィズム、ファイルの書き込みと読み取りが使用されます。重要な点は次のとおりです。 配列内のすべての従業員のポインタを維持するために、worker** の 2 次ポインタを作成します。コンストラクターでは、ファイルが存在するかどうか、およびファイル内にデータが存在するかどうかに応じてファイルが初期化されます。データがある場合は、ファイル内のデータを初期データとして読み込む必要があります。        

おすすめ

転載: blog.csdn.net/m0_74893211/article/details/131107964