首先帶大家看看文件的結(jié)構(gòu)以及樹狀圖
以下是具體的思路:
1、管理系統(tǒng)需求
職工管理系統(tǒng)可以用來管理公司內(nèi)所有員工信息
本教程主要利用c++來實(shí)現(xiàn)一個(gè)基于多態(tài)的職工管理系統(tǒng)
公司中職工分為三類:普通員工、經(jīng)理、老板、顯示信息時(shí),需要顯示職工編號(hào)、職工姓名、職工崗位、以及職責(zé)
普通員工職責(zé):完成經(jīng)理交給的任務(wù)
經(jīng)理的職責(zé):完成老板交給的任務(wù),并下發(fā)給任務(wù)給員工
老板職責(zé):管理公司所有事物
管理系統(tǒng)中需要實(shí)現(xiàn)的功能如下
-
推出管理程序: 退出當(dāng)前管理系統(tǒng)
-
增加職工信息: 實(shí)現(xiàn)批量添加職工功能,將信息錄入到文件中,職工信息為:職工編號(hào)、姓名、部門編號(hào)
-
顯示職工信息: 顯示公司內(nèi)部所有職工的信息
-
刪除離職職工:按照編號(hào)刪除指定的職工
-
修改職工信息: 按照編號(hào)修改職工個(gè)人信息
-
查找職工信息: 按照職工的編號(hào)或者職工的姓名進(jìn)行查找相關(guān)的人員信息
-
按照編號(hào)排序:按照職工編號(hào)、進(jìn)行排序,排序規(guī)則由用戶指定
-
清空所有文檔:清空文件中記錄的所有職工信息(清空前需要在此取人,防止誤刪)
系統(tǒng)界面效果如圖:
2、創(chuàng)建項(xiàng)目
創(chuàng)建項(xiàng)目步驟如下:
-
創(chuàng)建新項(xiàng)目
-
添加文件
2.1創(chuàng)建項(xiàng)目
打開vs2017后,點(diǎn)擊創(chuàng)建項(xiàng)目,創(chuàng)建新的C++項(xiàng)目
?文章來源:http://www.zghlxwxcb.cn/news/detail-480823.html
填寫項(xiàng)目名稱以及項(xiàng)目路徑,點(diǎn)擊確認(rèn)
?
2.2添加文件
右鍵源文件,進(jìn)行添加文件操作
?
?
至此項(xiàng)目已經(jīng)創(chuàng)建完畢
3、創(chuàng)建管理類
管理類負(fù)責(zé)的內(nèi)容如下:
-
與用戶的溝通菜單界面
-
對(duì)職工增刪改查的操作
-
與文件的讀寫交互
3.1創(chuàng)建文件
在頭文件和源文件的文件下分別創(chuàng)建workerManager.h和workManager.cpp文件
?
3.2頭文件實(shí)現(xiàn)
在workManager.h中設(shè)計(jì)管理類
代碼如下:
#pragma once//防止頭文件重復(fù)包含 #include <iostream>//包含輸入輸出流頭文件 using namespace std;//使用標(biāo)準(zhǔn)命名空間 class WorkerManager { public: //構(gòu)造函數(shù) WorkerManager(); //析構(gòu)函數(shù) ~WorkerManager(); };
在workerManager.cpp中設(shè)計(jì)管理類
代碼如下:
#include "workerManager.h" ? WorkerManager::WorkerManager() { ? } WorkerManager::~WorkerManager() { ? ? }
4、菜單功能
功能描述:與用戶的溝通界面
4.1 添加成員函數(shù)
在管理類workerManager.h中添加成員函數(shù) void Show_Menu():
#pragma once//防止頭文件重復(fù)包含 #include <iostream>//包含輸入輸出流頭文件 using namespace std;//使用標(biāo)準(zhǔn)命名空間 class WorkerManager { public: //構(gòu)造函數(shù) WorkerManager(); ? //展示菜單 void Show_Menu(); ? //析構(gòu)函數(shù) ~WorkerManager(); };
4.2 菜單功能實(shí)現(xiàn)
在管理類workerManager.cpp中實(shí)現(xiàn)Show_Menu()函數(shù)
#include "workerManager.h" ? WorkerManager::WorkerManager() { ? } //展示菜單 void WorkerManager::Show_Menu() { cout << "************************************" << endl; cout << "********* 歡迎使用職工管理系統(tǒng) *****" << endl; cout << "********** 0.退出管理程序! ********" << endl; cout << "********** 1.增加職工信息 **********" << endl; cout << "********** 2.顯示職工信息 **********" << endl; cout << "********** 3.刪除職工信息 **********" << endl; cout << "********** 4.修改職工信息 **********" << endl; cout << "********** 5.查找職工信息 **********" << endl; cout << "********** 6.按照編號(hào)排序 **********" << endl; cout << "********** 7.清空所有文檔 **********" << endl; cout << "**********************************" << endl; } WorkerManager::~WorkerManager() { if (this->m_EmArray != NULL) { delete[] this->m_EmArray; this->m_EmArray = NULL; } ? }
4.3 測試菜單功能
在職工管理系統(tǒng).cpp中測試菜單功能
代碼:
#include<iostream> using namespace std; #include "workerManager.h" ? int main() { //實(shí)例化管理者對(duì)象 WorkerManager wm; //調(diào)用展示菜單成員函數(shù) wm.Show_Menu(); system("pause"); return 0; }
運(yùn)行效果如圖:
?
5、退出功能
5.1提供功能接口
在main函數(shù)中提供分支選擇,提供每個(gè)功能接口
代碼:
#include<iostream> using namespace std; #include "workerManager.h" ? int main() { //實(shí)例化管理者對(duì)象 WorkManager wm; ? int choice = 0;//用來存儲(chǔ)用戶的選項(xiàng) while(true) { ? //調(diào)用展示菜單成員函數(shù) wm.Show_Menu(); cout << "請(qǐng)輸入您的選擇" << endl; cin >> choice;//接受用戶的選項(xiàng) switch (choice) { case 0://退出系統(tǒng) wm.ExitSystem(); break; case 1://增加職工 break; case 2://顯示職工 break; case 3://刪除職工 break; case 4://修改職工 break; case 5://查找職工 break; case 6://排序職工 break; case 7://清空文檔 break; default://清屏 break; } } system("pause"); return 0; }
5.2實(shí)現(xiàn)退出功能
在workerManager.h中退出系統(tǒng)的成員函數(shù) void exitSystem();
void ExitSystem();
在workerManager.cpp中提供具體的功能實(shí)現(xiàn)
代碼:
void WorkerManager::ExitSystem() { cout << "歡飲下次再使用" << endl; system("pause"); exit(0);//退出程序 }
5.3測試功能
在main函數(shù)分支0選項(xiàng)中,調(diào)用退出程序的接口
運(yùn)行測試截圖
?
6、創(chuàng)建職工類
6.1創(chuàng)建職工抽象類
職工的分類為: 普通員工、經(jīng)理、老板
將三種職工抽象到一個(gè)類(worker)中,利用多態(tài)管理不同職工種類
職工的屬性為:職工編號(hào)、職工姓名、職工所在部門編號(hào)
職工的行為:崗位指責(zé)信息描述、獲取崗位名稱
頭文件文件夾下 創(chuàng)建文件worker.h 文件并且添加如下代碼:
#pragma once #include<iostream> using namespace std; #include<string> ? //職工抽象類 class Worker { public: //顯示個(gè)人信息 virtual void showInfo() = 0; //獲取崗位名稱 virtual string getDeptName() = 0; //職工編號(hào) int m_Id; //職工姓名 string m_Name; //部門編號(hào) int m_DeptId; }; ?
6.2創(chuàng)建普通員工類
普通員工類繼承職工抽象類,并重寫父類中的純虛函數(shù)
在頭文件和源文件的文件夾下分別船艦employee.h和employee.cpp文件
employee.h中代碼如下:
//普通員工文件 #pragma once #include <iostream> using namespace std; #include "worker.h" class Employee :public Worker { public: //構(gòu)造函數(shù) Employee(int id,string name,int dId); //顯示個(gè)人信息 virtual void showInfo(); //獲取崗位名稱 virtual string getDeptName(); ? };
employee.cpp中代碼如下P:
#include "employee.h" //構(gòu)造函數(shù) Employee::Employee(int id, string name, int dId) { this->m_Id = id; this->m_Name = name; this->m_DeptId = dId; ? } //顯示個(gè)人信息 void Employee::showInfo() { cout << "職工編號(hào):" << this->m_Id << "\t職工姓名" << this->m_Name << "\t崗位:" << this->getDeptName() << "\t崗位職責(zé):完成經(jīng)理交給的任務(wù)" << endl; } //獲取崗位名稱 string Employee::getDeptName() { return string("員工"); } ?
測試代碼:
#include<iostream> using namespace std; #include "workerManager.h" #include "worker.h" #include "employee.h" int main() { //測試代碼 Worker *worker = NULL; worker = new Employee(1,"張三",1); worker->showInfo(); ? ?// 實(shí)例化管理者對(duì)象 // WorkManager wm; // // int choice = 0;//用來存儲(chǔ)用戶的選項(xiàng) // while(true) // { // ? //調(diào)用展示菜單成員函數(shù) // wm.Show_Menu(); // cout << "請(qǐng)輸入您的選擇" << endl; // cin >> choice;//接受用戶的選項(xiàng) // switch (choice) // { // case 0://退出系統(tǒng) // wm.ExitSystem(); // break; // case 1://增加職工 // break; // case 2://顯示職工 // break; // case 3://刪除職工 // break; // case 4://修改職工 // break; // case 5://查找職工 // break; // case 6://排序職工 // break; // case 7://清空文檔 // break; // default://清屏 break; // } // } // system("pause"); ? ?return 0; } ?
運(yùn)行效果截圖
?
6.3創(chuàng)建經(jīng)理類
經(jīng)理類繼承職工抽象類,并重寫父類中純虛函數(shù),和普通員工類似
在頭文件和源文件的文件夾下分別創(chuàng)建manager.h和manager.cpp文件
manager.h中代碼如下:
#pragma once #include <iostream> using namespace std; #include "worker.h" //經(jīng)理類 class Manager :public Worker { public: //構(gòu)造函數(shù) Manager(int id, string name, int dId); //顯示個(gè)人信息 virtual void showInfo(); //獲取崗位名稱 virtual string getDeptName(); };
manager.cpp中代碼如下:
#include "manager.h" //構(gòu)造函數(shù) Manager::Manager(int id, string name, int dId) { this->m_Id = id; this->m_Name = name; this->m_DeptId = dId; } //顯示個(gè)人信息 void Manager::showInfo() { cout << "職工編號(hào):" << this->m_Id << "\t職工姓名" << this->m_Name << "\t崗位:" << this->getDeptName() << "\t崗位職責(zé):完成老板交給的任務(wù),并且下發(fā)任務(wù)給員工" << endl; } //獲取崗位名稱 string Manager::getDeptName() { return string("經(jīng)理"); }
6.4創(chuàng)建老板類
老板類繼承職工抽象類,并重寫父類中的純虛函數(shù),和普通員工類似
在頭文件和源文件的文件夾下分別創(chuàng)建boss.h和boss.cpp文件
boss.h中代碼如下:
#pragma once #include <iostream> using namespace std; #include "worker.h" //老板類 class Boss :public Worker { public: //構(gòu)造函數(shù) ? Boss(int id, string name, int dId); //顯示個(gè)人信息 virtual void showInfo(); //獲取崗位名稱 virtual string getDeptName(); };
boss.cpp中代碼如下:
#include "boss.h" //構(gòu)造函數(shù) Boss::Boss(int id, string name, int dId) { this->m_Id = id; this->m_Name = name; this->m_DeptId = dId; } //顯示個(gè)人信息 void Boss::showInfo() { cout << "職工編號(hào):" << this->m_Id << "\t職工姓名" << this->m_Name << "\t崗位:" << this->getDeptName() << "\t崗位職責(zé):管理公司所有事務(wù)" << endl; } //獲取崗位名稱 string Boss::getDeptName() { return string("總裁"); }
6.5測試多態(tài)
在職工管理系統(tǒng).cpp中添加測試函數(shù),并且運(yùn)行能夠產(chǎn)生多態(tài)
測試代碼如下:
#include<iostream> using namespace std; #include "workerManager.h" #include "worker.h" #include "employee.h" #include "manager.h" #include "boss.h" int main() { //測試代碼 Worker *worker = NULL; worker = new Employee(1,"張三",1); worker->showInfo(); delete worker; ? worker = new Manager(2, "李四", 2); worker->showInfo(); delete worker; ? worker = new Boss(2, "王五", 2); worker->showInfo(); delete worker; ? ?system("pause"); return 0; }
運(yùn)行效果截圖
?
7、添加職工
功能描述: 批量添加職工,并且保存到文件中
7.1功能分析
分析:
用戶在批量創(chuàng)建時(shí),可能會(huì)創(chuàng)建不同種類的職工
如果向?qū)⑺胁煌N類的員工都放入到一個(gè)數(shù)組中,可以將所有員工的指針維護(hù)到同一個(gè)數(shù)組里
如果想在程序中維護(hù)這個(gè)不定長度的數(shù)組,可以將數(shù)組創(chuàng)建到堆區(qū),并利用Worker**的指針維護(hù)
?
7.2功能實(shí)現(xiàn)
在WorkerManager.h頭文件中添加成員屬性 代碼:
#pragma once//防止頭文件重復(fù)包含 #include <iostream>//包含輸入輸出流頭文件 using namespace std;//使用標(biāo)準(zhǔn)命名空間 #include "worker.h" #include "employee.h" #include "manager.h" #include "boss.h" class WorkerManager { public: //記錄職工人數(shù) int m_EmpNum; ? //職工數(shù)組指針 Worker ** m_EmArray; ? //添加職工 void Add_Emp(); };
在WorkerManager構(gòu)造函數(shù)中初始化屬性
? WorkerManager::WorkerManager() { //初始化屬性 this->m_EmpNum = 0; ? this->m_EmArray = NULL; } //析構(gòu)函數(shù) WorkerManager::~WorkerManager() { if (this->m_EmArray != NULL) { delete[] this->m_EmArray; this->m_EmArray = NULL; } ? }
workManager.cpp中實(shí)現(xiàn)該函數(shù)
//添加職工 void WorkerManager::Add_Emp() { cout << "請(qǐng)輸入添加職工數(shù)量:" << endl; int addNum=0;//保存用戶的輸入數(shù)量 cin >> addNum; if (addNum > 0) { //添加 //計(jì)算添加空間大小 int newSize = this->m_EmpNum + addNum;//新空間=原來記錄人數(shù)+新增人數(shù) //開辟新空間 Worker ** newSpace =new Worker*[newSize]; //將原來空間下數(shù)據(jù),拷貝到新空間下 if (this->m_EmArray != NULL) { for (int i = 0; i < this->m_EmpNum; i++) { newSpace[i] = this->m_EmArray[i]; } } //批量添加新數(shù)據(jù) for (int i=0;i<addNum;i++) { int id;//職工編號(hào) string name;//職工姓名 int dSelect;//部門選擇 cout << "請(qǐng)輸入第" << i + 1 << "個(gè)新職工編號(hào):" << endl; cin>>id; cout << "請(qǐng)輸入第" << i + 1 << "個(gè)新職工姓名:" << endl; cin >> name; cout << "請(qǐng)選擇該職工崗位:" << endl; cout << "1、普通職工" << endl; cout << "2、經(jīng)理" << 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); default: break; } //將創(chuàng)建職工職責(zé),保存到數(shù)組中 newSpace[this->m_EmpNum + i] = worker; } //釋放原有空間 delete[] this->m_EmArray; //更改新空間指向 this->m_EmArray = newSpace; //更新新的職工人數(shù) this->m_EmpNum = newSize; //成功添加后,保存到文件中 //提示添加成功 cout << "成功添加" << addNum << "名新職工" << endl; } else { //輸入有誤 cout << "輸入數(shù)據(jù)有誤" << endl; } //按任意鍵后,清屏回到上級(jí)目錄 system("pause"); system("cls"); }
7.3測試添加
運(yùn)行效果:
?
8、文件交互-寫文件
功能描述:對(duì)文件進(jìn)行讀寫
在上一個(gè)添加功能中,我們只是將所有的數(shù)據(jù)臺(tái)南佳到了內(nèi)存中,一旦程序結(jié)束就無法保存了,因此文件管理類中需要一個(gè)與文件進(jìn)行交互的功能,對(duì)于文件進(jìn)行讀寫操作
8.1設(shè)計(jì)文件路徑
首先我們將文件路徑,在workerManager.h中添加宏常量,并且包含頭文件fstream
#include <fstream> #define FILENAME "emFIle.txt"
8.2成員函數(shù)聲明
在workerManager.h中類里添加成員函數(shù) void save();
//保存文件 void save();
8.3保存文件功能實(shí)現(xiàn)
//保存文件 void WorkerManager::save() { ofstream ofs; ofs.open(FILENAME, ios::out);//用輸出的方式打開文件--寫文件 //將每個(gè)人的數(shù)據(jù)寫入到文件中 for (int i = 0; i < this->m_EmpNum; i++) { ofs << this->m_EmArray[i]->m_Id << " " << this->m_EmArray[i]->m_Name << " " << this->m_EmArray[i]->m_DeptId << endl; } //關(guān)閉文件 ofs.close(); }
8.4保存文件功能測試
//釋放原有空間 delete[] this->m_EmArray; //更改新空間指向 this->m_EmArray = newSpace; //更新新的職工人數(shù) this->m_EmpNum = newSize; //成功添加后,保存到文件中 //提示添加成功 cout << "成功添加" << addNum << "名新職工" << endl; //保存數(shù)據(jù)到文件中 this->save(); }
再次運(yùn)行代碼,添加職工
?
同級(jí)目錄下多出文件,并且保存了添加的信息
?
9、文件交互-讀文件
功能描述: 將文件中的內(nèi)容讀取到程序中
雖然我們實(shí)現(xiàn)了添加職工后保存到文件的操作,但是每次開始運(yùn)行程序,并沒有將文件中數(shù)據(jù)讀取到程序中
而我們的程序功能中還有清空文件的請(qǐng)求
因此狗哦早函數(shù)初始化數(shù)據(jù)的情況分為三種
1、第一次使用,文件未創(chuàng)建
2、文件存在,但是數(shù)據(jù)被用戶清空
3、文件存在,并且保護(hù)職工的所有數(shù)據(jù)
9.1文件未創(chuàng)建
在workerManager.h中添加新的成員屬性m_FileEmpty標(biāo)志文件是否為空
//判斷文件是否為空 標(biāo)志 bool m_FileIsEmpty;
修改WorkerManager.cpp中構(gòu)造函數(shù)代碼
ifstream ifs; ifs.open(FILENAME, ios::in);//讀文件 if (!ifs.is_open()) { cout << "文件不存在" << endl; //初始化屬性 //初始化記錄人數(shù) this->m_EmpNum = 0; //初始化數(shù)組指針 this->m_EmArray = NULL; //初始化文件是否為空 this->m_FileIsEmpty=true; ifs.close(); return; }
9.2文件存在且數(shù)據(jù)為空
在workerManager.cpp中的構(gòu)造函數(shù)追加代碼:
//2、文件存在 數(shù)據(jù)為空 char ch; ifs >> ch; if (ifs.eof()) { //文件為空 cout << "文件為空" << endl; //初始化屬性 //初始化記錄人數(shù) this->m_EmpNum = 0; //初始化數(shù)組指針 this->m_EmArray = NULL; //初始化文件是否為空 this->m_FileIsEmpty = true; ifs.close(); return; }
追加代碼位置如圖
?
將文件創(chuàng)建后清空文件內(nèi)容,并測試該情況下初始化功能
?
我們發(fā)現(xiàn)文件不存在或者為空,清空m_FilesEmpty 判斷文件是否為空的標(biāo)志都為真,那何時(shí)為假?
成功添加職工后,應(yīng)該更改文件不為空的標(biāo)志
在void WorkerManager::Add_Emp()成員函數(shù)中添加:
//更新職工不為空標(biāo)志 this->m_FileIsEmpty = false;
9.3文件存在且保存職工數(shù)據(jù)
9.3.1獲取記錄的職工人數(shù)
在workerManager.h中添加成員函數(shù) int get_EmpNum();
//統(tǒng)計(jì)文件中人數(shù) int get_EmpNum();
workerManager.cpp中實(shí)現(xiàn)
//統(tǒng)計(jì)文件中人數(shù) 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) { //統(tǒng)計(jì)人數(shù)變量 num++; } return num; }
在workerManager.cpp構(gòu)造函數(shù)中繼續(xù)追加代碼
//3、文件存在,并且記錄數(shù)據(jù) int num = this->get_EmpNum(); cout << "職工人數(shù)為 : " << num << endl; this->m_EmpNum = num;
手動(dòng)添加一些職工數(shù)據(jù),測試獲取職工數(shù)量函數(shù)
?
?
9.3.2 初始化數(shù)組
根據(jù)職工的數(shù)據(jù)以及職工數(shù)量,初始化workerManager中的Worker ** m_EmpArray 指針
在WorkerManager.h中添加成員函數(shù) void intit_Emp();
//初始化員工 void init_Emp();
在WorkerManager.cpp中實(shí)現(xiàn)
//初始化員工 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; if (dId == 1)//普通職工 { worker = new Employee(id, name, dId); } else if (dId == 2)//經(jīng)理 { worker = new Manager(id, name, dId); } else//老板 { worker = new Boss(id, name, dId); } this->m_EmArray[index] = worker; index++; } //關(guān)閉文件 ifs.close(); }
在workerManager.cpp構(gòu)造函數(shù)中追加代碼
//開辟空間 this->m_EmArray = new Worker*[this->m_EmpNum]; //將文件中的數(shù)據(jù)存到數(shù)組中 this->init_Emp(); //測試代碼 for (int i = 0; i < this->m_EmpNum; i++) { cout << "職工編號(hào)" << this->m_EmArray[i]->m_Id << "姓名:" << this->m_EmArray[i]->m_Name << "部門編號(hào):" << this->m_EmArray[i]->m_DeptId << endl; }
運(yùn)行效果如圖
?
10、顯示職工
功能描述:顯示當(dāng)前所有職工信息
10.1 顯示職工函數(shù)聲明
在workerManager.h中添加成員函數(shù) void Show_Emp();
//顯示職工 void Show_Emp();
10.2 顯示職工函數(shù)實(shí)現(xiàn)
在workerManager.cpp中實(shí)現(xiàn)成員函數(shù) void Show_Emp();
//顯示職工 void WorkerManager::Show_Emp() { //判斷文件是否為空 if (this->m_FileIsEmpty) { cout << "文件不存在或記錄為空!" << endl; } else { for (int i = 0; i < m_EmpNum; i++) { //利用多態(tài)調(diào)用程序接口 this->m_EmArray[i]->showInfo(); } } //按任意鍵后清屏 system("pause"); system("cls"); }
效果如圖:
?
10.3 測試顯示職工
case 2://顯示職工 wm.Show_Emp();
測試時(shí)分別測試 文件為空和文件不為空兩種情況
測試效果
測試1、文件不存在或者違抗情況
?
測試2、文件存在且有記錄情況
?
測試完畢,至此,顯示所有職工信息功能實(shí)現(xiàn)
11、刪除職工
11.1刪除職工函數(shù)聲明
在workerManager.h中添加成員函數(shù) void Del_Emp();
//刪除職工 void Del_Emp();
11.2職工是否存在函數(shù)聲明
很多功能都需要用到根據(jù)職工是否存在進(jìn)行操作如:刪除職工、修改職工、查找職工
因此添加該構(gòu)造公告函數(shù),以便后續(xù)調(diào)用
在workerManager.h中添加成員函數(shù) int IsExist(int id);
//判斷職工是否存在 如果存在返回職工所在數(shù)組中的位置,不存在返回-1 int IsExist(int id);
11.3職工是否存在函數(shù)實(shí)現(xiàn)
在workerManager.cpp中實(shí)現(xiàn)成員函數(shù) int IsExist(int id);
//判斷職工是否存在 如果存在返回職工所在數(shù)組中的位置,不存在返回-1 int WorkerManager::IsExist(int id) { int index = -1; for (int i = 0; i < this->m_EmpNum; i++) { if (this->m_EmArray[i]->m_Id==id) { //找到職工 index = 1; break; } } return index; }
11.4刪除職工函數(shù)實(shí)現(xiàn)
?
//刪除職工 void WorkerManager::Del_Emp() { if (this->m_FileIsEmpty) { cout << "請(qǐng)輸入想要?jiǎng)h除職工編號(hào):" << endl; int id = 0; cin >> id; int index = this->IsExist(id); if (index !=-1) //說明職工存在,并且要?jiǎng)h除掉index位置上的職工 { for (int i=index;i<this->m_EmpNum-1;i++) { //數(shù)據(jù)前移 this->m_EmArray[i] = this->m_EmArray[i + 1]; } this->m_EmpNum--;//更新數(shù)組中記錄人員個(gè)數(shù) //同步更新到文件中 this->save(); cout << "刪除成功" << endl; } else { cout << "刪除失敗,未找到該職工" << endl; } } //按任意鍵清屏 system("pause"); system("cls"); }
11.5測試刪除職工
case 3://刪除職工 // { // //測試 // // int ret = wm.IsExist(8); // if (ret != -1) // { // cout << "職工存在" << endl; // } // else // { // cout << "職工不存在" << endl; // } wm.Del_Emp(); break;
測試1、刪除不存在職工情況
?
測試2、刪除存在職工情況
?
再次顯示所有職工信息,確保已經(jīng)刪除
?
查看文件中信息,再次核實(shí)員工已被完全刪除
?
12、修改職工
功能描述:能夠按照職工的編號(hào)對(duì)職工信息進(jìn)行修改并保存
12.1修改職工函數(shù)聲明
在workerManager.h中添加成員函數(shù) void Mod_Emp();
//修改員工 void Mod_Emp();
12.2修改職工函數(shù)實(shí)現(xiàn)
在workerManager.cpp中實(shí)現(xiàn)成員函數(shù) void Mod_Emp();
//修改員工 void WorkerManager::Mod_Emp() { if (this ->m_FileIsEmpty) { cout << "文件不存在或記錄為空!" << endl; } else { cout << "請(qǐng)輸入修改職工的編號(hào):" << endl; int id; cin >> id; int ret = this->IsExist(id); if (ret != -1) { //查找到編號(hào)的職工 delete this->m_EmArray[ret]; int newId = 0; string newName = ""; int dSelect = 0; cout << "查到 ;" << id << "號(hào)職工,請(qǐng)輸入新職工號(hào):" << endl; cin >> newId; cout << "請(qǐng)輸入新姓名:" << endl; cin >> newName; cout << "請(qǐng)輸入崗位" << endl; cout << "1、普通崗位" << endl; cout << "2、經(jīng)理" << endl; cout << "3、老板" << endl; cin >> dSelect; Worker *worker = NULL; switch (dSelect) { case 1: worker = new Employee(newId, newName, dSelect); break; case 2: worker = new Manager(newId, newName, dSelect); break; case 3: worker = new Boss(newId, newName, dSelect); break; default: break; } //更新數(shù)據(jù) 到數(shù)組中 this->m_EmArray[ret] = worker; cout << "修改成功" << endl; //保存到文件中 this->save(); } else { cout << "修改失敗,查無此人" << endl; } } system("pause"); system("cls"); }
測試:
無此人:
?
13、查找職工
功能描述:提供兩種查找職工方式,一種按照職工編號(hào),一種按照職工姓名
13.1 查找職工函數(shù)聲明
在workerManager.h中添加成員函數(shù) void Find_Emp();
//查找職工 void Find_Emp();
13.2查找職工函數(shù)實(shí)現(xiàn)
在workerManager.cpp中實(shí)現(xiàn)成員函數(shù) void Find_Emp();
//查找職工 void WorkerManager::Find_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或記錄為空" << endl; } else { cout << "請(qǐng)輸入查找的方式:" << endl; cout << "1、按照職工編號(hào)查找" << endl; cout << "2、按照姓名查找" << endl; int select = 0; cin >> select; if (select == 1) { //按照編號(hào)查 int id; cout << "請(qǐng)輸入查找的職工編號(hào):" << endl; cin >> id; int ret = IsExist(id); if (ret != -1) { //找到職工 cout << "查找成功!該職工信息如下:" << endl; this->m_EmArray[ret]->showInfo(); } else { cout << "查找失敗,查無此人" << endl; } } else if (select == 2) { //按照姓名查 string name; cout << "請(qǐng)輸入查找的姓名:" << endl; cin >> name; //介入判斷是否查到的標(biāo)志 bool flag = false;//默認(rèn)未找到職工 for (int i = 0; i < m_EmpNum; i++) { if (this->m_EmArray[i]->m_Name == name) { cout << "查找成功,職工編號(hào)為:" << this->m_EmArray[i]->m_Id << "號(hào)職工信息如下:" << endl; flag = true; //調(diào)用顯示信息接口 this->m_EmArray[i]->showInfo(); } } if (flag == false) { cout << "查找失敗,查無此人!" << endl; } } else { cout << "輸入選項(xiàng)有誤" << endl; } } //按任意鍵清屏 system("pause"); system("cls"); }
13.3測試查找職工
case 5://查找職工 wm.Find_Emp(); break;
1.按編號(hào)
?
2、按姓名
?
14、排序
功能描述:按照職工編號(hào)進(jìn)行排序,排序的順序由用戶指定
14.1排序函數(shù)聲明
在workerManager.h中添加成員函數(shù) void Sort_Emp();
//按照編號(hào)排序 void Sort_Emp();
14.2 排序函數(shù)實(shí)現(xiàn)
在workerManager.cpp中實(shí)現(xiàn)成員函數(shù) void Sort_Emp();
//按照編號(hào)排序 void WorkerManager::Sort_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或記錄為空" << endl; system("pause"); system("cls"); } else { cout << "請(qǐng)輸入排序方式:" << endl; cout << "1、按照工號(hào)進(jìn)行升序" << endl; cout << "2、按照工號(hào)進(jìn)行降序" << endl; int select = 0; cin >> select; for (int i = 0; i < m_EmpNum; i++) { int minOrMax = i;//聲明最小值或最大值下標(biāo) for (int j = i + 1; j < this->m_EmpNum; j++) { if (select == 1)//升序 { if (this->m_EmArray[minOrMax]->m_Id>this->m_EmArray[j]->m_Id) { minOrMax = j; } } else//降序 { if (this->m_EmArray[minOrMax]->m_Id < this->m_EmArray[j]->m_Id) { minOrMax = j; } } } //判斷一開始認(rèn)定 最小值或最大值 是不是計(jì)算的最大值或最小值 ,如果不是 交換數(shù)據(jù) if (i != minOrMax) { Worker * temp = this->m_EmArray[i]; this->m_EmArray[i] = this->m_EmArray[minOrMax]; this->m_EmArray[minOrMax] = temp; } } cout << "排序成功!排序后的結(jié)果為:" << endl; this->save();//排序后結(jié)果保存到文件中 this->Show_Emp();//展示所有職工 } }
測試:
case 6://排序職工 wm.Sort_Emp(); break;
升序:
?
?
降序:
?
?
15、清空文件
功能描述:將文件記錄數(shù)據(jù)清空
15.1 清空函數(shù)聲明
在workerManager.h中添加成員函數(shù) void Clean_File();
//清空文件操作 void Clean_File();
15.2清空函數(shù)實(shí)現(xiàn)
在workerManager.cpp中實(shí)現(xiàn)成員函數(shù) void Clean_File();
//清空文件操作 void WorkerManager::Clean_File() { cout << "確定清空?" << endl; cout << "1、確定" << endl; cout << "2、返回" << endl; int select = 0; cin >> select; if (select == 1) { //清空文件 ofstream ofs(FILENAME, ios::trunc);//刪除文件后重新創(chuàng)建 ofs.close(); if (this->m_EmArray != NULL) { //刪除堆區(qū)的每個(gè)職工對(duì)象 for (int i=0;i<this->m_EmpNum;i++) { delete this->m_EmArray[i]; this->m_EmArray[i] = NULL; } //刪除堆區(qū)數(shù)組指針 delete[] this->m_EmArray; this->m_EmArray = NULL; this->m_EmpNum = 0; this->m_FileIsEmpty = true; } cout << "清空成功!" << endl; } system("pause"); system("cls"); }
15.3 測試清空文件
在main函數(shù)分支7選項(xiàng)中,調(diào)用清空文件窗口
case 7://清空文檔 wm.Clean_File(); break; default://清屏 system("cls"); break;
測試確認(rèn)清空文件
?
再次查看文件中數(shù)據(jù),記錄已空
?
打開文件,里面數(shù)據(jù)已確保清空,該功能需要慎用
?
隨著文件功能實(shí)現(xiàn),本案例制作完畢~文章來源地址http://www.zghlxwxcb.cn/news/detail-480823.html
到了這里,關(guān)于用c++實(shí)現(xiàn)職工管理系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!