程序设计"/>
C++:基于多态的企业职工系统程序设计
(一)作者瞎叨叨:
时隔五日,甚是想念。今天回来更新一下自己的学习成果啦!本次程序设计是【黑马程序员~C++】中的C++核心编程的程序设计题,基于多态的企业职工系统程序设计,由于我学习速度较快,还不够扎实,这个程序设计结果是介于理解与独立编程之间的,也就是说一定程度上参考了官方程序的思想再加上自己的思考完成的这一个程序设计,也算是我的一个阶段性成果啦!
——Agoni酱
(二)设计要求:
(三)程序相关事项(可见于.cpp程序文件开头):
/*
开发项目:【黑马程序员~C++核心编程程序设计】基于多态的企业职工系统
程序结构:头文件:boss.h (boss子类声明) employee.h (employee子类声明)
manager.h (manager子类声明) worker.h (worker父类声明)
workerManager.h (workerManager类声明,用于调用函数)
源文件:boss.h (boss子类函数定义) employee.h (employee子类函数定义)
manager.h (manager子类函数定义) worker.h (worker父类函数定义)
workerManager.h (workerManager类函数定义,用于调用函数)
开发语言:C++开发环境:Windows Visual Studio 2022
程序实现:可以完成对职工的添加,显示,修改,删除,查找,排序,清空操作,并且可以写入文件保存再读取
程序特性:由于C++核心编程我学习的速度有点快,还不那么扎实,是借助了原版程序编写的,在编写的同时将将其完善,增加了空文件的全方位检测机制,增加了工号查重机制,完善程序引导,增加输入监测机制程序是基于多态完成的,构建了两个大类,其中一个类增加了三个子类,使得程序清晰明了
*/
/*
完成时间:2023年1月8日01:25:52当前版本:V1.0
发布时间:2023年1月8日09:32:50
更新日志:无
*/
(四)源文件(5个)
- 职工管理系统.cpp
/*开发项目:【黑马程序员~C++核心编程程序设计】基于多态的企业职工系统程序结构:头文件:boss.h (boss子类声明) employee.h (employee子类声明)manager.h (manager子类声明) worker.h (worker父类声明)workerManager.h (workerManager类声明,用于调用函数)源文件:boss.h (boss子类函数定义) employee.h (employee子类函数定义)manager.h (manager子类函数定义) worker.h (worker父类函数定义)workerManager.h (workerManager类函数定义,用于调用函数)开发语言:C++ 开发环境:Windows Visual Studio 2022程序实现:可以完成对职工的添加,显示,修改,删除,查找,排序,清空操作,并且可以写入文件保存再读取程序特性:由于C++核心编程我学习的速度有点快,还不那么扎实,是借助了原版程序编写的,在编写的同时将将其完善,增加了空文件的全方位检测机制,增加了工号查重机制,完善程序引导,增加输入监测机制程序是基于多态完成的,构建了两个大类,其中一个类增加了三个子类,使得程序清晰明了
*//*完成时间:2023年1月8日01:25:52 当前版本:V1.0发布时间:2023年1月8日09:32:50更新日志:无
*/#include <iostream>
using namespace std;
#include "workerManager.h"int main() {WorkerManager wm;int choice = 0;while (true) {wm.Show_Menu();cout << "system:请输入您想执行操作的序号:";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:cout << "system:无效的数字!请重新输入!!!" << endl;system("pause");system("cls");break;}}system("cls");return 0;
}// THE END
- boss.cpp
#include "boss.h"Boss::Boss(int id, string name, int job) {this->m_id = id;this->m_name = name;this->m_job = job;
}void Boss::showInfo() {cout << "system:工号:" << this->m_id << "\t姓名:" << this->m_name<< "\t职位:" << this->getjobname() << "\t职责:管理公司所有事务" << endl;
}string Boss::getjobname() {return string("总裁");
}
- manager.cpp
#include "manager.h"Manager::Manager(int id, string name, int job) {this->m_id = id;this->m_name = name;this->m_job = job;
}void Manager::showInfo() {cout << "system:工号:" << this->m_id << "\t姓名:" << this->m_name<< "\t职位:" << this->getjobname() << "\t职责:完成总裁交给的任务,并下发任务给员工" << endl;
}string Manager::getjobname() {return string("经理");
}
- employee.cpp
#include "employee.h"Employee::Employee(int id, string name, int job) {this->m_id = id;this->m_name = name;this->m_job = job;
}void Employee::showInfo() {cout << "system:工号:" << this->m_id << "\t姓名:" << this->m_name<< "\t职位:" << this->getjobname() << "\t职责:完成经理交给的任务" << endl;
}string Employee::getjobname() {return string("员工");
}
- workerManager.cpp
#include "workerManager.h"WorkerManager::WorkerManager() {ifstream ifs;ifs.open(FILENAME, ios::in);if (!ifs.is_open()) {this->m_EmpNum = 0;this->m_EmpArray = NULL;this->m_FilesEmpty = true;ifs.close();return;}char ch;ifs >> ch;if (ifs.eof()) {this->m_EmpNum = 0;this->m_EmpArray = NULL;this->m_FilesEmpty = true;ifs.close();return;}int num = this->get_EmpNum();this->m_EmpNum = num;this->m_EmpArray = new Worker * [this->m_EmpNum];this->init_Emp();
}void WorkerManager::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 << "********* 制作:CSDN agoni酱 *********" << endl;cout << "**************************************" << endl;cout << endl;
}void WorkerManager::ExitSystem(){cout << "system:欢迎下次使用!" << endl;system("pause");exit(0);
}void WorkerManager::Add_Emp() {cout << "system:请输入添加职工数量:";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 job;while (true) {cout << "system:请输入第" << i + 1 << "个新职工的编号:";cin >> id;if (IsExist(id,newSpace, m_EmpNum + i )==-1) {break;}cout << "system:输入编号重复!!!请重新输入!" << endl;}cout << "system:请输入第" << i + 1 << "个新职工的姓名:" ;cin >> name;out:cout << "system:请选择该职工的职位(1 员工 2 经理 3 总裁):";cin >> job;Worker* worker = NULL;switch (job) {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:cout << "system:输入错误!请仔细查看后再次输入!!!" << endl;goto out;}newSpace[this->m_EmpNum + i] = worker;}delete[]this->m_EmpArray;this->m_EmpArray = newSpace;this->m_EmpNum = newSize;this->m_FilesEmpty = false;this->save();cout << "system:成功添加" << addNum << "名新职工!" << endl;}else {cout << "system:输入数据有误" << endl;}system("pause");system("cls");
}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_job << endl;}ofs.close();
}int WorkerManager::get_EmpNum() {ifstream ifs;ifs.open(FILENAME, ios::in);int id;string name;int job;int num = 0;while (ifs >> id && ifs >> name && ifs >> job) {num++;}return num;
}void WorkerManager::init_Emp() {ifstream ifs;ifs.open(FILENAME, ios::in);int id;string name;int job;int index = 0;while (ifs >> id && ifs >> name && ifs >> job) {Worker* worker = NULL;if (job == 1) {worker = new Employee(id, name, job);}else if (job == 2) {worker = new Manager(id, name, job);}else {worker = new Boss(id, name, job);}this->m_EmpArray[index] = worker;index++;}ifs.close();
}void WorkerManager::Show_Emp() {if (this->m_FilesEmpty) {cout << "system:文件不存在或记录为空!" << endl;}else {for (int i = 0; i < m_EmpNum; i++) {this->m_EmpArray[i]->showInfo();}}system("pause");system("cls");
}void WorkerManager::Del_Emp() {if (this->m_FilesEmpty) {cout << "system:文件不存在或记录为空!" << endl;}else {cout << "system:请输入您想要删除的工号:";int id = 0;cin >> id;int index = this->IsExist(id);if (index != -1) {for (int i = index; i < m_EmpNum-1; i++) {this->m_EmpArray[i]=this->m_EmpArray[i+1];}this->m_EmpNum--;this->save();cout << "system:删除成功!" << endl;if (this->m_EmpNum == 0) {this->m_FilesEmpty = true;}}else {cout << "system:删除失败,未找到该职工" << endl;}}system("pause");system("cls");
}int WorkerManager::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;
}int WorkerManager::IsExist(int id , Worker**address , int num) {int index = -1;for (int i = 0; i < num; i++) {if (address[i]->m_id == id) {index = i;break;}}return index;
}void WorkerManager::Mod_Emp() {if (this->m_FilesEmpty) {cout << "system:文件不存在或记录为空!" << endl;}else {cout << "system:请输入您想要修改的职工的工号:";int id;cin >> id;int ret = this->IsExist(id);if (ret != -1) {delete this->m_EmpArray[ret];int newid = 0;string newname = "";int job = 0;cout << "system:成功查询到:" << id << "号职工,请输入新工号:";last:cin >> newid;if (this->IsExist(newid) != -1) {cout << "system:与原数据中某个工号重复!请重新输入:" ;goto last;}cout << "system:请输入新姓名:";cin >> newname;cout << "system:请输入新职位(1 员工 2 经理 3 总裁):";cin >> job;Worker* worker = NULL;switch (job) {case 1:worker = new Employee(newid, newname, 1);break;case 2:worker = new Manager(newid, newname, 2);break;case 3:worker = new Boss(newid, newname, 3);break;default:break;}this->m_EmpArray[ret] = worker;cout << "system:修改成功!" << endl << "system:修改为:";this->m_EmpArray[ret]->showInfo();this->save();}else {cout << "system:修改失败,未找到该职工" << endl;}}system("pause");system("cls");
}void WorkerManager::Find_Emp() {if (this->m_FilesEmpty) {cout << "system:文件不存在或记录为空!" << endl;}else {cout << "system:请输入查找方式(1 编号 2 姓名):";int in = 0;cin >> in;if (in == 1) {int id;cout << "system:请输入查找的职工工号:" ;cin >> id;int ret = IsExist(id);if (ret != -1) {cout << "system:查找成功!该职工信息如下:" << endl;this->m_EmpArray[ret]->showInfo();}else {cout << "system:查找失败,未找到该职工" << endl;}}else if (in ==2){string name;cout << "system:请输入查找的职工姓名:";cin >> name;bool flag = false;for (int i = 0; i < m_EmpNum; i++) {if (this->m_EmpArray[i]->m_name == name) {cout << "system:查找成功!工号为" << this->m_EmpArray[i]->m_id << "职工信息如下:" << endl;flag = true;this->m_EmpArray[i]->showInfo();}}if (flag == false) {cout << "system:查找失败,未找到该职工" << endl;}}else {cout << "system:输入选项有误!" << endl;}}system("pause");system("cls");
}void WorkerManager::Sort_Emp() {if (this->m_FilesEmpty) {cout << "system:文件不存在或记录为空!" << endl;system("pause");system("cls");}else {cout << "system:请选择排序方式(1 升序 2 降序):";int in = 0;cin >> in;for (int i = 0; i < m_EmpNum; i++) {int minOrMax = i;for (int j = i + 1; j < this->m_EmpNum; j++) {if (in == 1) {if (this->m_EmpArray[minOrMax]->m_id>m_EmpArray[j]->m_id) {minOrMax = j;}}else {if (this->m_EmpArray[minOrMax]->m_id < m_EmpArray[j]->m_id) {minOrMax = j;}}}if (i != minOrMax) {Worker* temp = this->m_EmpArray[i];this->m_EmpArray[i]=this->m_EmpArray[minOrMax];this->m_EmpArray[minOrMax] = temp;}}cout << "system:排序成功!排序后的结果为:" << endl;this->save();this->Show_Emp();}
}void WorkerManager::Clean_File(){if (this->m_FilesEmpty == true) {cout << "system:当前文本为空!无需清空!" << endl ;}else {cout << "system:确认清空?(1 确定 其他数字 返回):";int in = 0;cin >> in;if (in == 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_FilesEmpty = true;}cout << "system:清空成功!" << endl;}else {cout << "system:取消清空!" << endl;}}system("pause");system("cls");
}WorkerManager::~WorkerManager() {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;}
}
(五)头文件(5个)
- worker.h
#pragma once
#include <iostream>
using namespace std;class Worker {public:virtual void showInfo() = 0;virtual string getjobname() = 0;int m_id;string m_name;int m_job;
};
- boss.h
#pragma once
#include <iostream>
using namespace std;
#include "worker.h"class Boss : public Worker {public:Boss(int id, string name, int job);virtual void showInfo();virtual string getjobname();
};
- manager.h
#pragma once
#include <iostream>
using namespace std;
#include "worker.h"class Manager : public Worker {public:Manager(int id, string name, int job);virtual void showInfo();virtual string getjobname();};
- employee.h
#pragma once
#include <iostream>
using namespace std;
#include "worker.h"class Employee : public Worker {public:Employee(int id, string name, int job);virtual void showInfo();virtual string getjobname();
};
- workerManager.h
#pragma once
#include <iostream>
using namespace std;
#include "worker.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"#include <fstream>
#define FILENAME "save.txt"class WorkerManager {
public:int m_EmpNum;Worker** m_EmpArray;bool m_FilesEmpty; WorkerManager();void Show_Menu();void ExitSystem();void Add_Emp();void save();int get_EmpNum();void init_Emp();void Show_Emp();void Del_Emp();int IsExist(int id);int IsExist(int id, Worker** address, int num);void Mod_Emp();void Find_Emp();void Sort_Emp();void Clean_File();~WorkerManager();};
(六)版权声明:
此程序完全由本人制作,并且仅在CSDN平台发布,虽然我是个小菜鸡,但也是不能商用的哦嘿嘿
(七)结语
这是我第二次发布文章啦,如有不妥麻烦您能够提出来!!!如果您对代码有建议可以私信我哦,感谢大家的支持,感谢观看,我们,很快再见!
更多推荐
C++:基于多态的企业职工系统程序设计
发布评论