网站网页建设实训心得,网站建设 添加本地视频教程,大型网站建设价格,网站能给企业带来什么本专栏记录C学习过程包括C基础以及数据结构和算法#xff0c;其中第一部分计划时间一个月#xff0c;主要跟着黑马视频教程#xff0c;学习路线如下#xff0c;不定时更新#xff0c;欢迎关注。 当前章节处于#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战… 本专栏记录C学习过程包括C基础以及数据结构和算法其中第一部分计划时间一个月主要跟着黑马视频教程学习路线如下不定时更新欢迎关注。 当前章节处于 ---------第1阶段-C基础入门 ---------第2阶段实战-通讯录管理系统 ---------第3阶段-C核心编程 第4阶段实战-基于多态的企业职工系统 ---------第5阶段-C提高编程 ---------第6阶段实战-基于STL泛化编程的演讲比赛 ---------第7阶段-C实战项目机房预约管理系统 文章目录 一、 项目介绍二、需求分析三、代码实现3.1 抽象类3.2 结构体3.3 显示菜单3.4 添加管理系统到文件3.5 添加员工信息3.6 显示系统3.7 删除员工信息3.8 修改员工信息3.9 查找员工信息3.10 按编号排序3.11 清空管理系统3.12 main主函数 四、完整代码五、测试案例 一、 项目介绍
职工管理系统可以用来管理工资内所有员工的信息要求利用C来实现一个基于多态的职工管理系统。 公司中职工分为三类普通职工、经理和老板显示信息时需要显示职工编号、职工姓名、职工岗位以及职责。
普通员工职责完成经理交给的任务经理职责完成老板交给的任务并下发任务给员工老板职责管理公司所有事务
管理系统中需要实现的功能如下
退出管理系统增加职工信息实现批量添加职工功能将信息录入到文件中职工信息为职工编号、姓名、部门编号显示职工信息显示公司内部所有职工的信息删除离职员工按照编号删除指定的职工修改职工信息按照编号修改职工个人信息查找职工信息按照职工的编号或者职工的姓名进行查找相关的人员信息按照编号排序按照职工编号进行排序排序规则由用户指定清空所有文档清空文件中记录的所有职工信息清除前需要再次确认防止误删
二、需求分析
整个管理系统可以看成一个类数组类数组中需要定义一个员工数方便后面进行逻辑上的清空。首先需要抽象一个职工类作为父类然后普通员工经理和老板继承员工类作为子类父类中需要定义职工编号职工姓名职工岗位三个属性。退出管理系统说明整个是在一个while循环里面批量增加员工信息说明是在for循环里面实例化对象添加到类数组里面为保证职工编号唯一需要添加判断。并且需要将信息录入文件中则需要涉及到文件流的操作因为后续会反复更新文件所以需要将文件更新封装成函数。显示员工信息时遍历类数组并且需要判断类成员的部门编号打印对应职责。删除、修改和查找大同小异遍历找到之后再做下一个操作值得注意的是删除需要将员工数-1。这四个操作在开始前都需要判断一下员工数如果等于0的话说明管理系统为空给出提示并返回。按照编号排序无非升序和降序这里给一个变量让用户选择即可使用冒泡排序对实例化对象中的序号进行排序。清空文档将类数组中员工数置零即可做逻辑上的清空。为保证友好的交互还应设计一个选择菜单在循环中反复调用。
三、代码实现
3.1 抽象类
// 职工类
class Staff {
public:int numcard; // 职工编号string name; // 职工姓名string department; // 职工部门string work; // 职责
};
// 员工类
class Employee:public Staff {
};
// 经理类
class Manager :public Staff {
};
// 老板类boss
class Boss :public Staff {
};3.2 结构体
// 管理系统结构体
struct Managersystem {Staff system[MaxNum];int peoplenum;
};3.3 显示菜单
// 显示菜单
void showMenu() {cout -----欢迎来到职工管理系统---- endl;cout 1.增加职工信息 endl;cout 2.删除职工信息 endl;cout 3.修改职工信息 endl;cout 4.查找职工信息 endl;cout 5.显示职工信息 endl;cout 6.按照编号排序 endl;cout 7.清空管理系统 endl;cout 8.退出管理系统 endl;
}3.4 添加管理系统到文件
// 添加管理系统到文件
bool systemToFile(Managersystem ms) {// 管理系统到文件fstream ofs;ofs.open(System.txt, ios::out); // 如果不存在会先创建,先删除再创建for (int i 0; i ms.peoplenum; i) {ofs ms.system[i].numcard ms.system[i].name ms.system[i].department endl;}ofs.close();return true;
}3.5 添加员工信息
// 添加员工信息
bool addStaff(Managersystem ms) {// 达到最大值if (ms.peoplenum MaxNum) {cout 已达到系统所容纳最大人数添加失败 endl;return false; // 退出}// 批量添加int allnum;cout 请输入你要添加的人数;cin allnum;bool foundDuplicate false; // 标记int count 0; // 统计人数for (int n 0; n allnum; n) {int dp; // 部门string name; // 姓名int num; // 职工编号cout 选择职位 endl;cout 1.员工 endl;cout 2.经理 endl;cout 3.老板 endl;cin dp;cout 请输入职工编号:;cin num;// 保证编号的唯一性for (int i 0; i ms.peoplenum; i) {if (num ms.system[i].numcard) {cout 该职员编号已存在 endl;foundDuplicate true;break;}}if (foundDuplicate) {foundDuplicate false; // 重置标记continue; // 跳过当前外部循环继续执行下一次外部循环}cout 请输入姓名 ;cin name;if (dp 1) {Employee ep;ep.name name;ep.numcard num;ep.department 员工;ep.work 完成经理交给的任务;ms.system[ms.peoplenum] ep;}else if (dp 2) {Manager mg;mg.name name;mg.numcard num;mg.department 经理;mg.work 完成老板交给的任务并下发任务给员工;ms.system[ms.peoplenum] mg;}else {Boss bs;bs.name name;bs.numcard num;bs.department 老板;bs.work 管理公司所有事务;ms.system[ms.peoplenum] bs;}count;ms.peoplenum;}cout 一共添加了 count 人 endl;return true;
}3.6 显示系统
// 显示系统
void showSystem(const Managersystem ms) {if (ms.peoplenum 0) {cout 系统为空 endl;return;}for (int i 0; i ms.peoplenum; i) {cout 员工编号 ms.system[i].numcard 部门 ms.system[i].department 姓名 ms.system[i].name \t职责 ms.system[i].work endl;}
}3.7 删除员工信息
// 删除职工信息
bool deleteStaff(Managersystem ms) {if (ms.peoplenum 0) {cout 系统为空 endl;return false;}int numcard;cout 请输入你要删除的职工编号;cin numcard;for (int i 0; i ms.peoplenum; i) {if (ms.system[i].numcard numcard) {if (ms.peoplenum 1) {cout 走这 endl;ms.peoplenum 0; // 系统里面就一个人直接做逻辑删除}else {// 比如i1一共有4个j需要从1开始到3for (int j i; j ms.peoplenum; j) {ms.system[j] ms.system[j 1]; // 后面的移到前面}ms.peoplenum--;}return true;}}cout 没有你要删除的编号 endl;return false;
}3.8 修改员工信息
// 修改职工信息
bool changeStaff(Managersystem ms) {if (ms.peoplenum 0) {cout 系统为空 endl;return false;}int numcard;cout 请输入你要修改的职工编号;cin numcard;string target;for (int i 0; i ms.peoplenum; i) {if (ms.system[i].numcard numcard) {cout 请输入你要修改的信息:;cin target;if (target.compare(编号) 0) {int targetnum;cout 请输入修改之后的编号;cin targetnum;ms.system[i].numcard targetnum;return true;}else if (target.compare(姓名) 0) {string targetname;cout 请输入修改之后的姓名;cin targetname;ms.system[i].name targetname;return true;}else if (target.compare(部门) 0) {string targetdp;cout 请输入修改之后的部门;cin targetdp;ms.system[i].department targetdp;return true;}else {cout 没有这个选项 endl;return false;}}}
}3.9 查找员工信息
// 查找职员信息
bool findStaff(Managersystem ms) {if (ms.peoplenum 0) {cout 系统为空 endl;return false;}int numcard;cout 请输入你要查找的职工编号;cin numcard;string target;for (int i 0; i ms.peoplenum; i) {if (ms.system[i].numcard numcard) {cout 员工编号 ms.system[i].numcard 部门 ms.system[i].department 姓名 ms.system[i].name 职责 ms.system[i].work endl;return true;}}cout 查无此人 endl;return false;
}3.10 按编号排序
// 按照编号排序
void popStaff(Managersystem ms) {int choice;cout 请输入排序方式: endl;cout 1.顺序 endl;cout 2.逆序 endl;cin choice;if (ms.peoplenum 0) {cout 系统为空 endl;return;}if (choice 1) {for (int i 0; i ms.peoplenum - 1; i) {for (int j 0; j ms.peoplenum - i - 1; j) {// 冒泡排序if (ms.system[j].numcard ms.system[j 1].numcard) {// 交换Staff temp ms.system[j];ms.system[j] ms.system[j 1];ms.system[j 1] temp;}}}}else {for (int i 0; i ms.peoplenum - 1; i) {for (int j 0; j ms.peoplenum - i - 1; j) {// 冒泡排序if (ms.system[j].numcard ms.system[j 1].numcard) {// 交换Staff temp ms.system[j];ms.system[j] ms.system[j 1];ms.system[j 1] temp;}}}}showSystem(ms);
}3.11 清空管理系统
// 清空管理系统
bool deleteSystem(Managersystem ms) {// 做逻辑情况int choice;cout 是否清空管理系统 endl;cout 1.Yes endl;cout 2.No endl;cin choice;if (choice 1) {ms.peoplenum 0; // 逻辑清空return true;}return false;
}3.12 main主函数
int main() {// 创建一个管理系统结构体Managersystem mainsystem;mainsystem.peoplenum 0; // 开始时置零while (1) {showMenu();int choice;cout 请输入你的选项:;cin choice;switch (choice){case 1:addStaff(mainsystem);systemToFile(mainsystem);break;case 2:deleteStaff(mainsystem);systemToFile(mainsystem);break;case 3:changeStaff(mainsystem);systemToFile(mainsystem);break;case 4:findStaff(mainsystem);break;case 5:showSystem(mainsystem);break;case 6:popStaff(mainsystem);systemToFile(mainsystem);break;case 7:deleteSystem(mainsystem);systemToFile(mainsystem);break;case 8:return 0;default:cout 没有这个选项 endl;break;}}system(pause);return 0;
}四、完整代码
#include iostream
using namespace std;
#include fstream
// 定义员工系统最大容纳人数
#define MaxNum 100
// 职工类
class Staff {
public:int numcard; // 职工编号string name; // 职工姓名string department; // 职工部门string work; // 职责
};
// 员工类
class Employee:public Staff {
};
// 经理类
class Manager :public Staff {
};
// 老板类boss
class Boss :public Staff {
};
// 管理系统结构体
struct Managersystem {Staff system[MaxNum];int peoplenum;
};
// 显示菜单
void showMenu() {cout -----欢迎来到职工管理系统---- endl;cout 1.增加职工信息 endl;cout 2.删除职工信息 endl;cout 3.修改职工信息 endl;cout 4.查找职工信息 endl;cout 5.显示职工信息 endl;cout 6.按照编号排序 endl;cout 7.清空管理系统 endl;cout 8.退出管理系统 endl;
}
// 添加管理系统到文件
bool systemToFile(Managersystem ms) {// 管理系统到文件fstream ofs;ofs.open(System.txt, ios::out); // 如果不存在会先创建,先删除再创建for (int i 0; i ms.peoplenum; i) {ofs ms.system[i].numcard ms.system[i].name ms.system[i].department endl;}ofs.close();return true;
}
// 添加员工信息
bool addStaff(Managersystem ms) {// 达到最大值if (ms.peoplenum MaxNum) {cout 已达到系统所容纳最大人数添加失败 endl;return false; // 退出}// 批量添加int allnum;cout 请输入你要添加的人数;cin allnum;bool foundDuplicate false; // 标记int count 0; // 统计人数for (int n 0; n allnum; n) {int dp; // 部门string name; // 姓名int num; // 职工编号cout 选择职位 endl;cout 1.员工 endl;cout 2.经理 endl;cout 3.老板 endl;cin dp;cout 请输入职工编号:;cin num;// 保证编号的唯一性for (int i 0; i ms.peoplenum; i) {if (num ms.system[i].numcard) {cout 该职员编号已存在 endl;foundDuplicate true;break;}}if (foundDuplicate) {foundDuplicate false; // 重置标记continue; // 跳过当前外部循环继续执行下一次外部循环}cout 请输入姓名 ;cin name;if (dp 1) {Employee ep;ep.name name;ep.numcard num;ep.department 员工;ep.work 完成经理交给的任务;ms.system[ms.peoplenum] ep;}else if (dp 2) {Manager mg;mg.name name;mg.numcard num;mg.department 经理;mg.work 完成老板交给的任务并下发任务给员工;ms.system[ms.peoplenum] mg;}else {Boss bs;bs.name name;bs.numcard num;bs.department 老板;bs.work 管理公司所有事务;ms.system[ms.peoplenum] bs;}count;ms.peoplenum;}cout 一共添加了 count 人 endl;return true;
}
// 显示系统
void showSystem(const Managersystem ms) {if (ms.peoplenum 0) {cout 系统为空 endl;return;}for (int i 0; i ms.peoplenum; i) {cout 员工编号 ms.system[i].numcard 部门 ms.system[i].department 姓名 ms.system[i].name \t职责 ms.system[i].work endl;}
}
// 删除职工信息
bool deleteStaff(Managersystem ms) {if (ms.peoplenum 0) {cout 系统为空 endl;return false;}int numcard;cout 请输入你要删除的职工编号;cin numcard;for (int i 0; i ms.peoplenum; i) {if (ms.system[i].numcard numcard) {if (ms.peoplenum 1) {cout 走这 endl;ms.peoplenum 0; // 系统里面就一个人直接做逻辑删除}else {// 比如i1一共有4个j需要从1开始到3for (int j i; j ms.peoplenum; j) {ms.system[j] ms.system[j 1]; // 后面的移到前面}ms.peoplenum--;}return true;}}cout 没有你要删除的编号 endl;return false;
}
// 修改职工信息
bool changeStaff(Managersystem ms) {if (ms.peoplenum 0) {cout 系统为空 endl;return false;}int numcard;cout 请输入你要修改的职工编号;cin numcard;string target;for (int i 0; i ms.peoplenum; i) {if (ms.system[i].numcard numcard) {cout 请输入你要修改的信息:;cin target;if (target.compare(编号) 0) {int targetnum;cout 请输入修改之后的编号;cin targetnum;ms.system[i].numcard targetnum;return true;}else if (target.compare(姓名) 0) {string targetname;cout 请输入修改之后的姓名;cin targetname;ms.system[i].name targetname;return true;}else if (target.compare(部门) 0) {string targetdp;cout 请输入修改之后的部门;cin targetdp;ms.system[i].department targetdp;return true;}else {cout 没有这个选项 endl;return false;}}}
}
// 查找职员信息
bool findStaff(Managersystem ms) {if (ms.peoplenum 0) {cout 系统为空 endl;return false;}int numcard;cout 请输入你要查找的职工编号;cin numcard;string target;for (int i 0; i ms.peoplenum; i) {if (ms.system[i].numcard numcard) {cout 员工编号 ms.system[i].numcard 部门 ms.system[i].department 姓名 ms.system[i].name 职责 ms.system[i].work endl;return true;}}cout 查无此人 endl;return false;
}
// 按照编号排序
void popStaff(Managersystem ms) {int choice;cout 请输入排序方式: endl;cout 1.顺序 endl;cout 2.逆序 endl;cin choice;if (ms.peoplenum 0) {cout 系统为空 endl;return;}if (choice 1) {for (int i 0; i ms.peoplenum - 1; i) {for (int j 0; j ms.peoplenum - i - 1; j) {// 冒泡排序if (ms.system[j].numcard ms.system[j 1].numcard) {// 交换Staff temp ms.system[j];ms.system[j] ms.system[j 1];ms.system[j 1] temp;}}}}else {for (int i 0; i ms.peoplenum - 1; i) {for (int j 0; j ms.peoplenum - i - 1; j) {// 冒泡排序if (ms.system[j].numcard ms.system[j 1].numcard) {// 交换Staff temp ms.system[j];ms.system[j] ms.system[j 1];ms.system[j 1] temp;}}}}showSystem(ms);
}
// 清空管理系统
bool deleteSystem(Managersystem ms) {// 做逻辑情况int choice;cout 是否清空管理系统 endl;cout 1.Yes endl;cout 2.No endl;cin choice;if (choice 1) {ms.peoplenum 0; // 逻辑清空return true;}return false;
}
int main() {// 创建一个管理系统结构体Managersystem mainsystem;mainsystem.peoplenum 0; // 开始时置零while (1) {showMenu();int choice;cout 请输入你的选项:;cin choice;switch (choice){case 1:addStaff(mainsystem);systemToFile(mainsystem);break;case 2:deleteStaff(mainsystem);systemToFile(mainsystem);break;case 3:changeStaff(mainsystem);systemToFile(mainsystem);break;case 4:findStaff(mainsystem);break;case 5:showSystem(mainsystem);break;case 6:popStaff(mainsystem);systemToFile(mainsystem);break;case 7:deleteSystem(mainsystem);systemToFile(mainsystem);break;case 8:return 0;default:cout 没有这个选项 endl;break;}}system(pause);return 0;
}五、测试案例
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:1
请输入你要添加的人数3
选择职位
1.员工
2.经理
3.老板
1
请输入职工编号:1
请输入姓名张三
选择职位
1.员工
2.经理
3.老板
2
请输入职工编号:2
请输入姓名李四
选择职位
1.员工
2.经理
3.老板
3
请输入职工编号:3
请输入姓名王五
一共添加了3人
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:5
员工编号1 部门员工 姓名张三 职责完成经理交给的任务
员工编号2 部门经理 姓名李四 职责完成老板交给的任务并下发任务给员工
员工编号3 部门老板 姓名王五 职责管理公司所有事务
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:2
请输入你要删除的职工编号2
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:5
员工编号1 部门员工 姓名张三 职责完成经理交给的任务
员工编号3 部门老板 姓名王五 职责管理公司所有事务
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:3
请输入你要修改的职工编号1
请输入你要修改的信息:部门
请输入修改之后的部门经理
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:5
员工编号1 部门经理 姓名张三 职责完成经理交给的任务
员工编号3 部门老板 姓名王五 职责管理公司所有事务
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:4
请输入你要查找的职工编号1
员工编号1 部门经理 姓名张三 职责完成经理交给的任务
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:4
请输入你要查找的职工编号2
查无此人
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:1
请输入你要添加的人数1
选择职位
1.员工
2.经理
3.老板
1
请输入职工编号:2
请输入姓名赵六
一共添加了1人
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:1
请输入你要添加的人数1
选择职位
1.员工
2.经理
3.老板
1
请输入职工编号:1
该职员编号已存在
一共添加了0人
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:5
员工编号1 部门经理 姓名张三 职责完成经理交给的任务
员工编号3 部门老板 姓名王五 职责管理公司所有事务
员工编号2 部门员工 姓名赵六 职责完成经理交给的任务
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:6
请输入排序方式:
1.顺序
2.逆序
1
员工编号1 部门经理 姓名张三 职责完成经理交给的任务
员工编号2 部门员工 姓名赵六 职责完成经理交给的任务
员工编号3 部门老板 姓名王五 职责管理公司所有事务
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:6
请输入排序方式:
1.顺序
2.逆序
2
员工编号3 部门老板 姓名王五 职责管理公司所有事务
员工编号2 部门员工 姓名赵六 职责完成经理交给的任务
员工编号1 部门经理 姓名张三 职责完成经理交给的任务
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:7
是否清空管理系统
1.Yes
2.No
1
-----欢迎来到职工管理系统----1.增加职工信息2.删除职工信息3.修改职工信息4.查找职工信息5.显示职工信息6.按照编号排序7.清空管理系统8.退出管理系统
请输入你的选项:8D:\桌面\C学习\1.14\x64\Debug\1.14.exe (进程 5464)已退出代码为 0。
要在调试停止时自动关闭控制台请启用“工具”-“选项”-“调试”-“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .