C++核心编程——基于多态的企业职工系统
本专栏记录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 {// 比如i=1,一共有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 {// 比如i=1,一共有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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
相关文章:
C++核心编程——基于多态的企业职工系统
本专栏记录C学习过程包括C基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注。 当前章节处于: ---------第1阶段-C基础入门 ---------第2阶段实战…...

Nginx服务安装
Nginx(发音为[engine x])专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消 耗,以及对HTTP并发连接的高处理能力(单台物理服务器可支持30000~50000个并发请求)。正因 为如此,大量提供社交网络、…...

微信小程序canvas画布实现矩形元素自由缩放、移动功能
一、获取画布信息并绘制背景 .whml <canvas class="canvas" type="2d" id="myCanvas" bindtouchstart="get_rect_touch_position" bindtouchmove="move_or_scale" bind:tap="finish_edit_check"/> 定义c…...
一文搞懂 Python 3 中的数据类型
介绍 在 Python 中,与所有编程语言一样,数据类型用于对一种特定类型的数据进行分类。这很重要,因为您使用的特定数据类型将决定您可以为其分配哪些值以及您可以对其执行哪些操作(包括可以对其执行哪些操作)。 1. 数字…...

学习笔记之——3D Gaussian Splatting源码解读
之前博客对3DGS进行了学习与调研 学习笔记之——3D Gaussian Splatting及其在SLAM与自动驾驶上的应用调研-CSDN博客文章浏览阅读450次。论文主页3D Gaussian Splatting是最近NeRF方面的突破性工作,它的特点在于重建质量高的情况下还能接入传统光栅化,优…...

Flink standalone集群部署配置
文章目录 简介软件依赖部署方案二、安装1.下载并解压2.ssh免密登录3.修改配置文件3.启动集群4.访问 Web UI 简介 Flink独立模式(Standalone)是部署 Flink 最基本也是最简单的方式:所需要的所有 Flink 组件, 都只是操作系统上运行…...
Python: + 运算符、append() 方法和 extend()方法的区别和用法
在Python中,有几种常见的方式可以向列表中添加元素,其中包括使用 运算符、append() 方法和 extend() 方法。 使用 运算符: 运算符用于合并两个列表。 通过创建一个新列表,包含两个被合并的列表的元素。不会修改原始列表&…...

【MySQL】mysql集群
文章目录 一、mysql日志错误日志查询日志二进制日志慢查询日志redo log和undo log 二、mysql集群主从复制原理介绍配置命令 读写分离原理介绍配置命令 三、mysql分库分表垂直拆分水平拆分 一、mysql日志 MySQL日志 是记录 MySQL 数据库系统运行过程中不同事件和操作的信息的文件…...

zabbix监控windows主机
下载安装zabbix agent安装包 Zabbix官网下载地址: https://www.zabbix.com/cn/download_agents?version5.0LTS&release5.0.40&osWindows&os_versionAny&hardwareamd64&encryptionOpenSSL&packagingMSI&show_legacy0 这里使用zabbix agent2 安装 …...

单例模式的八种写法、单例和并发的关系
文章目录 1.单例模式的作用2.单例模式的适用场景3.饿汉式静态常量(可用)静态代码块(可用) 4.懒汉式线程不安全(不可用)同步方法(线程安全,但不推荐用)同步代码块…...

基于实时Linux+FPGA实现NI CompactRIO系统详解
利用集成的软件工具链,结合信号调理I/O模块,轻松构建和部署实时应用程序。 什么是CompactRIO? CompactRIO系统提供了高处理性能、传感器专用I/O和紧密集成的软件工具,使其成为工业物联网、监测和控制应用的理想之选。实时处理器提…...

Webhook端口中的自定义签名身份认证
概述 如果需要通过 Webhook 端口从交易伙伴处接收数据,但该交易伙伴可能对于安全性有着较高的要求,而不仅仅是用于验证入站 Webhook 要求的基本身份验证用户名/密码,或者用户可能只想在入站 Webhook 消息上增加额外的安全层。 使用 Webhook…...

用Linux的视角来理解缓冲区概念
缓冲区的认识 缓冲区(buffer)是存储数据的临时存储区域。当我们用C语言向文件中写入数据时,数据并不会直接的写到文件中,中途还经过了缓冲区,而我们需要对缓冲区的数据进行刷新,那么数据才算写到文件当中。…...
C#中Enumerable.Range(Int32, Int32) 方法用于计算
目录 一、关于Enumerable.Range(Int32, Int32) 方法 1.定义 2.Enumerable.Range()用于数学计算的操作方法 3.实例1:显示整型数1~9的平方 4.实例2:显示整型数0~9 5.实例3:Enumerable.Range()vs for循环 &#x…...
Linux和windows进程同步与线程同步那些事儿(四):windows 下进程同步
Linux和windows进程同步与线程同步那些事儿(一) Linux和windows进程同步与线程同步那些事儿(二): windows线程同步详解示例 Linux和windows进程同步与线程同步那些事儿(三): Linux线…...
1. Logback介绍
Logback介绍 Logback旨在成为流行的log4j项目的继任者。它由Ceki Glc设计,他是log4j的创始人。它基于十年在设计工业级日志系统方 面的经验。结果产品,即logback,比所有现有的日志系统更快,具有更小的占用空间,有时差距…...

SqueezeNet:通过紧凑架构彻底改变深度学习
一、介绍 在深度学习领域,对效率和性能的追求往往会带来创新的架构。SqueezeNet 是神经网络设计的一项突破,体现了这种追求。本文深入研究了 SqueezeNet 的复杂性,探讨其独特的架构、设计背后的基本原理、应用及其对深度学习领域的影响。 在创…...
Python:正则表达式之re.group()用法
Python正则表达式之re.group()用法学习笔记 正则表达式是在处理字符串时非常有用的工具,而re.group()是在匹配到的文本中提取特定分组内容的方法之一。 1. re.group()的基本用法 在正则表达式中,通过圆括号可以创建一个或多个分组。re.group()用于获取…...

Shiro框架:Shiro登录认证流程源码解析
目录 1.用户登录认证流程 1.1 生成认证Token 1.2 用户登录认证 1.2.1 SecurityManager login流程解析 1.2.1.1 authenticate方法进行登录认证 1.2.1.1.1 单Realm认证 1.2.1.2 认证通过后创建登录用户对象 1.2.1.2.1 复制SubjectContext 1.2.1.2.2 对subjectContext设…...

WEB前端人机交互导论实验-实训2格式化文本、段落与列表
1.项目1 文本与段落标记的应用: A.题目要求: B.思路: (1)首先,HTML文档的基本结构是通过<html>...</html>标签包围的,包含了头部信息和页面主体内容。 (2)在头部信息…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...