一个基于多态的C++项目,断断续续写了两三天。获得一些收获和大家分享。欢迎指正交流。
********* 欢迎使用职工管理系统 *********
************ 0.退出管理系统 ************
************ 1.增加职工信息 ************
************ 2.显示职工信息 ************
************ 3.删除离职职工 ************
************ 4.修改职工信息 ************
************ 5.查找职工信息 ************
************ 6.按照编号排序 ************
************ 7.清空所有文档 ************
******************************************
职工类为接口,派生出老板类、经理类、员工类,分别实现不同的岗位名称和岗位职责的输出。
C++有一种万物皆可为对象的概念,整个程序就可以视作一个管理程序的对象,创建WorkerManager类,逐一实现:菜单展示、增加职工、显示职工、删除职工、修改职工、查找职工以及排序、清空等多种功能。
程序的交互过程均需要用到循环,在循环过程中处理交互的各种情况。例如:
1、用户的主菜单选择以及返回主菜单。
2、用户的输入不合法时,重新输入。
3、用户完成工作后,返回上级或者返回主菜单。
通过文件读写实现数据的操作,写文件时先将职工数量写入第一行,方便后续操作
根据程序的不同需求设置清晰的架构脉络,主线程序代码要足够健壮(没有bug),再逐一实现其他功能函数。将程序分割为多个模块再组合起来实现复杂的需求,是一个项目成功的必备条件,这也是C++的封装特性的体现。
- #include
- using namespace std;
- #include"workerManager.h"
- #include"Worker.h"
-
- int main(int argc, char const *argv[]) {
-
- //创建职工管理类对象
- workerManager WM;
- //定义用户选项
- int choice = -1;
- while (true) {
- WM.Show_Menu();
- cout << "请输入您的选择" << endl;
- cin >> choice;
- switch (choice) {
- case 0: //退出系统
- WM.Exit_System();
- break;
- case 1: //增加职工
- WM.Add_Worker();
- break;
- case 2: //显示职工
- WM.Show_Worker();
- break;
- case 3: //删除职工
- WM.Del_Worker();
- break;
- case 4: //修改职工
- WM.Mod_Worker();
- break;
- case 5: //查找职工
- WM.Search_Worker();
- break;
- case 6: //编号排序
- WM.Sort_ID();
- break;
- case 7: //清空文档
- WM.Clear_Worker();
- break;
- }
- system("pause");
- system("cls");
- }
- return 0;
- }
- #pragma once
- #include
- using namespace std;
- #include
- #include
//c++标准库,主要功能设置输出格式 - enum Post
- {
- BOSS,
- MANAGER,
- EMPLOYEE,
- POSTCOUNT
- };
- //职工类
- class Worker
- {
- public:
- int m_id; //职工编号
- string m_name; //职工姓名
- int m_post; //岗位编号
- //显示职工信息
- virtual void show_Info() = 0;
- //获得职工岗位
- virtual string get_Postname() = 0;
- };
- //老板类
- class Boss :public Worker {
- public:
- Boss(int id, string name, int post);
- void show_Info();
- string get_Postname();
- };
- //经理类
- class Manager :public Worker {
- public:
- Manager(int id, string name, int post);
- void show_Info();
- string get_Postname();
- };
- //普通员工类
- class Employee :public Worker {
- public:
- Employee(int id, string name, int post);
- void show_Info();
- string get_Postname();
- };
- #include "Worker.h"
-
- Boss::Boss(int id, string name, int post)
- {
- m_id = id;
- m_name = name;
- m_post = post;
- }
- void Boss::show_Info()
- {
- //设置输出编号占两个字符宽度,空位用'0'填充,通过setiosflag(ios::left/right)可以调整靠左或者靠右
- cout << "序号:" << setw(2) << setfill('0') << m_id
- << "\t姓名:" << m_name
- << "\t岗位:" << get_Postname()
- << "\t岗位职责:负责公司全面工作,安排经理的工作" << endl;
- }
- string Boss::get_Postname()
- {
- return string("老板");
- }
-
-
- Manager::Manager(int id, string name, int post)
- {
- m_id = id;
- m_name = name;
- m_post = post;
- }
- void Manager::show_Info()
- {
- cout << "序号:" << setw(2) << setfill('0') << m_id
- << "\t姓名:" << m_name
- << "\t岗位:" << get_Postname()
- << "\t岗位职责:完成老板交办任务,安排员工的工作" << endl;
- }
- string Manager::get_Postname()
- {
- return string("经理");
- }
-
- Employee::Employee(int id, string name, int post)
- {
- m_id = id;
- m_name = name;
- m_post = post;
- }
- void Employee::show_Info()
- {
- cout << "序号:" << setw(2) << setfill('0') << m_id
- << "\t姓名:" << m_name
- << "\t岗位:" << get_Postname()
- << "\t岗位职责:完成经理交办任务" << endl;
- }
- string Employee::get_Postname()
- {
- return string("员工");
- }
- #pragma once //防止头文件重复包含
- #include
//包含输入输出流头文件 - using namespace std;//使用标准命名空间
- #include"Worker.h"
- #define FILENAME "Worker.txt"
-
- //职工管理类
- class workerManager
- {
- public:
- //职工指针数组
- Worker** ptr_Worker_array;
- //职工人数
- int m_count;
- //文件为空标志
- bool m_EmptyFile;
- //构造函数
- workerManager();
-
- //展示菜单函数
- void Show_Menu();
- //退出系统
- void Exit_System();
- //增加职工
- void Add_Worker();
- //显示职工
- void Show_Worker();
- //删除职工
- void Del_Worker();
- //修改职工
- void Mod_Worker();
- //查找职工
- void Search_Worker();
- //获得文件中人数
- int get_count();
- //保存数据到文件中
- int save();
- //查找编号,返回下标
- void Search_ID();
- //查找姓名,返回相同姓名职工的个数
- void Search_Name();
- //按照编号排序
- void Sort_ID();
- //清空文件
- void Clear_Worker();
- ~workerManager();
- };
- #include "workerManager.h"
- #include
- //workerManager构造函数
- workerManager::workerManager() {
- ifstream ifs;
- ifs.open(FILENAME, ios::in);
- //1、无文件
- if (!ifs.is_open()) {
- cout << "文件不存在" << endl;
- m_EmptyFile = true;
- m_count = 0;
- ptr_Worker_array = NULL;
- }
-
- else {
- //读取职工数量
- ifs >> m_count;
- //2、空文件
- if (!m_count) {
- cout << "文件为空" << endl;
- m_EmptyFile = true;
- m_count = 0;
- ptr_Worker_array = NULL;
- }
- //3、存在数据
- else {
- m_EmptyFile = false;
- ptr_Worker_array = new Worker*[m_count];
-
- Worker* newWorker = NULL;
- int id = 0, num = 0, IDnum = 0;
- string name;
- int post = -1;
- while (ifs >> id && ifs >> name && ifs >> post) {
-
- switch (post) {
- case BOSS:newWorker = new Boss(id, name, post);
- break;
- case MANAGER:newWorker = new Manager(id, name, post);
- break;
- case EMPLOYEE:newWorker = new Employee(id, name, post);
- break;
- }
- ptr_Worker_array[num++] = newWorker;
- }
- }
- ifs.close();
- }
- }
- //显示主界面
- 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 << "******************************************" << endl;
- cout << endl;
- }
- //退出系统
- void workerManager::Exit_System()
- {
- if (this->save()) {
- cout << "信息保存成功,欢迎下次使用" << endl;
- system("pause");
- exit(0);
- }
- else {
- cout << "信息保存失败,请重新保存" << endl;
- }
- }
- //添加职工
- void workerManager::Add_Worker()
- {
- int newWorker = 0;
- cout << "请输入添加职工数量:" << endl;
- cin >> newWorker;
- Worker** ptr = new Worker*[m_count + newWorker];
- if (m_count) {
- for (int i = 0; i < m_count; i++) {
- ptr[i] = ptr_Worker_array[i];
-
- }
- delete ptr_Worker_array;
- }
- ptr_Worker_array = ptr;
- int id = -1;
- string name;
- int post = -1;
- Worker *worker = NULL;
- for (int i = 0; i < newWorker; i++) {
- cout << "请输入第" << i + 1 << "个职工的编号(输入0返回上级):" << endl;
- cin >> id;
- while (true) {
- if (id < 0) {
- cout << "输入不合法,请重新输入:" << endl;
- }
- else if (id == 0) {
- return;
- }
- else {
- int j = 0;
- for (j = 0; j < m_count; j++) {
- if (id == ptr_Worker_array[j]->m_id) {
- cout << "编号已被占用,请重新输入:" << endl;
- cin >> id;
- break;
- }
- }
- if (j == m_count) {
- break;
- }
- }
- }
-
- cout << "请输入第" << i + 1 << "个职工的姓名:" << endl;
- cin >> name;
- cout << "请选择该职工岗位:" << endl;
- cout << "1.老板" << endl;
- cout << "2.经理" << endl;
- cout << "3.员工" << endl;
- cin >> post;
- switch (post - 1) {
- case BOSS:
- worker = new Boss(id, name, BOSS);
- break;
- case MANAGER:
- worker = new Manager(id, name, MANAGER);
- break;
- case EMPLOYEE:
- worker = new Employee(id, name, EMPLOYEE);
- break;
- }
- ptr_Worker_array[m_count] = worker;
- m_count++;
- }
- if (this->save()) {
- cout << "成功添加 " << newWorker << " 名职工信息" << endl;
- m_EmptyFile = false;
-
- }
- }
- //显示职工
- void workerManager::Show_Worker()
- {
- if (m_count && !m_EmptyFile) {
- for (int i = 0; i < m_count; i++) {
- ptr_Worker_array[i]->show_Info();
- }
- }
- }
- //删除职工
- void workerManager::Del_Worker()
- {
- if (m_EmptyFile) {
- cout << "文件不存在" << endl;
- }
- else if (m_count == 0) {
- cout << "文件为空" << endl;
- }
- else {
- cout << "请输入要删除的职工编号(输入0返回上级):" << endl;
- int id = 0, i = 0;
- cin >> id;
- while (id != ptr_Worker_array[i]->m_id) {
- if (id < 0) {
- cout << "输入不合法,请重新输入:" << endl;
- cin >> id;
- }
- else if (id == 0) {
- return;
- }
- else {
- for (i = 0; i < m_count; i++) {
- if (id == ptr_Worker_array[i]->m_id) {
- break;
- }
- }
- if (i == m_count) {
- cout << "查无此人,请重新输入:" << endl;
- cin >> id;
- i = 0;
- }
- }
- }
- delete ptr_Worker_array[i];
- ptr_Worker_array[i] = NULL;
- for (; i < m_count - 1; i++) {
- ptr_Worker_array[i] = ptr_Worker_array[i + 1];
- }
- m_count--;
- if (m_count == 0) m_EmptyFile = true;
- if (this->save()) {
- cout << "删除成功" << endl;
- }
- }
- }
- //修改职工
- void workerManager::Mod_Worker()
- {
- if (m_EmptyFile) {
- cout << "文件不存在" << endl;
- }
- else if (m_count == 0) {
- cout << "文件为空" << endl;
- }
- else {
- cout << "请输入要修改的职工编号(输入0返回上级):" << endl;
-
-
- int id = 0, i = 0;
- cin >> id;
- while (id != ptr_Worker_array[i]->m_id) {
- if (id < 0) {
- cout << "输入不合法,请重新输入:" << endl;
- cin >> id;
- }
- else if (id == 0) {
- return;
- }
- else {
- for (i = 0; i < m_count; i++) {
- if (id == ptr_Worker_array[i]->m_id) {
- break;
- }
- }
- if (i == m_count) {
- cout << "查无此人,请重新输入:" << endl;
- cin >> id;
- i = 0;
- }
- }
- }
-
- int newID = 0;
- string newName;
- int newPost = -1;
-
- cout << "请输入新编号:" << endl;
- cin >> newID;
- while (true) {
- if (newID <= 0) {
- cout << "输入不合法,请重新输入:" << endl;
- cin >> newID;
- }
- else {
- int j = 0;
- for (j = 0; j < m_count; j++) {
- if (newID == ptr_Worker_array[j]->m_id&&i != j) {
- cout << "编号已被占用,请重新输入:" << endl;
- cin >> newID;
- break;
- }
- }
- if (j == m_count) {
- break;
- }
- }
- }
-
- cout << "请输入新姓名:" << endl;
- cin >> newName;
-
- cout << "请选择职工岗位:" << endl;
- cout << "1.老板" << endl;
- cout << "2.经理" << endl;
- cout << "3.员工" << endl;
- cin >> newPost;
- delete ptr_Worker_array[i];
- ptr_Worker_array[i] = NULL;
- switch (newPost - 1) {
- case BOSS:ptr_Worker_array[i] = new Boss(newID, newName, BOSS);
- break;
- case MANAGER:ptr_Worker_array[i] = new Manager(newID, newName, MANAGER);
- break;
- case EMPLOYEE:ptr_Worker_array[i] = new Employee(newID, newName, EMPLOYEE);
- break;
- }
- if (save()) {
- cout << "修改成功" << endl;
- }
- }
- }
-
- void workerManager::Search_Worker()
- {
- cout << "请选择查找条件(输入0返回上级):" << endl;
- cout << "1.职工编号" << endl;
- cout << "2.职工姓名" << endl;
- int choice = 0;
- cin >> choice;
- while (choice) {
- if (choice == 1) {
- Search_ID();
- break;
- }
- else if (choice == 2) {
- Search_Name();
- break;
- }
- else {
- cout << "输入不合法,请重新输入:" << endl;
- cin >> choice;
- }
- }
- }
-
- int workerManager::get_count()
- {
- int cnt = 0;
- ifstream ifs;
- ifs.open(FILENAME, ios::in);
- if (ifs.is_open()) {
- ifs >> cnt;
- ifs.close();
- }
- return cnt;
- }
-
- int workerManager::save()
- {
- int res = 1;
- ofstream ofs;
- ofs.open(FILENAME, ios::out);
- if (ofs.is_open()) {
- ofs << m_count << endl;
- for (int i = 0; i < m_count; i++) {
- ofs << ptr_Worker_array[i]->m_id << " "
- << ptr_Worker_array[i]->m_name << " "
- << ptr_Worker_array[i]->m_post << endl;
- }
- ofs.close();
- }
- else {
- res = 0;
- }
- return res;
- }
-
- void workerManager::Search_ID()
- {
- cout << "请输入要查找的编号(输入0返回上级):" << endl;
- int id = -1;
- cin >> id;
- while (id) {
- if (id < 0) {
- cout << "输入不合法,请重新输入:" << endl;
- cin >> id;
- }
- else {
- for (int i = 0; i < m_count; i++) {
- if (id == ptr_Worker_array[i]->m_id) {
- ptr_Worker_array[i]->show_Info();
- id = 0;
- break;
- }
- if (i == m_count - 1 && id != 0) {
- cout << "查无此人,请重新输入:" << endl;
- cin >> id;
- }
- }
- }
- }
- }
-
- void workerManager::Search_Name()
- {
- int cnt = 0;
-
- cout << "请输入要查找的姓名(输入0返回上级):" << endl;
- string name;
- cin >> name;
- while (name != "0") {
- for (int i = 0; i < m_count; i++) {
- if (name == ptr_Worker_array[i]->m_name) {
- cnt++;
- ptr_Worker_array[i]->show_Info();
- if (i == m_count - 1) name = "0";
- }
- if (i == m_count - 1 && cnt == 0) {
- system("pause");
- cout << "查无此人,请重新输入:" << endl;
- cin >> name;
- }
- }
- }
- }
-
- void workerManager::Sort_ID()
- {
- for (int i = 0; i < m_count - 1; i++) {
- int MinOrMax = i;
- for (int j = i + 1; j < m_count; j++) {
- if (ptr_Worker_array[i]->m_id < ptr_Worker_array[j]->m_id) {
- MinOrMax = j;
- }
- }
- if (MinOrMax != i) {
- Worker* temp = ptr_Worker_array[MinOrMax];
- ptr_Worker_array[MinOrMax] = ptr_Worker_array[i];
- ptr_Worker_array[i] = temp;
- }
- }
- cout << "排序成功" << endl;
- }
-
- void workerManager::Clear_Worker()
- {
- if (m_count) {
- for (int i = 0; i < m_count; i++) {
- if (ptr_Worker_array[i])
- delete ptr_Worker_array[i];
- ptr_Worker_array[i] = NULL;
- }
- m_count = 0;
- }
- if (save()) {
- cout << "清空文件成功" << endl;
- }
- }
-
- workerManager::~workerManager() {
- if (m_count) {
- for (int i = 0; i < m_count; i++) {
- if (ptr_Worker_array[i])
- delete ptr_Worker_array[i];
- ptr_Worker_array[i] = NULL;
- }
- }
- delete[] ptr_Worker_array;
- ptr_Worker_array = NULL;
- }