在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第十八篇博客。
本篇博客用C++实现职工管理系统,本文是上半部分。
本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。
目录
这里使用C++的多态实现一个简单的职工管理系统。
公司的职工分为三类,普通员工,经理和老板。在显示信息时,需要显示职工编号,职工姓名,职工岗位以及职责。普通员工的职责是完成经理交给的任务。经理职责是完成老板交给的任务,并下发任务给普通员工。老板的职责是管理公司所有事物。
管理系统需要的功能有:
退出管理程序:退出当前管理系统
增加职工信息:添加职工功能,并将信息写入文件中,职工信息为职工编号,姓名和部门编号。
显示职工信息:显示公司内所有职工信息
删除职工:按编号删除职工
修改职工信息:按照编号修改个人信息
查找职工信息:按照职工的编号或姓名进行查找。
按照编号排序:按照职工编号进行排序。
清空文档:清除文件的所有信息
总程序有700多行,并且进行了分文件编写,因此只会放代码段。这一部分描述组成程序的文件。
system.cpp源文件有main函数,是程序的入口,通过此文件进入所有操作。
workmanager.h头文件和workmanager.cpp源文件有workmanager类的全部内容,该类是对职工的操作。
worker.h内是worker类的全部内容,内含职工共同的信息,因为是多态的父类,因此函数为纯虚函数。
manager.h和manager.cpp是worker类的全部内容,是对经理基本信息的操作。
employee.h和employee.cpp是employee类的全部内容,是对普通员工基本信息的操作。
boss.h和boss.cpp是boss类的全部内容,是对老板基本信息的操作。
- void workmanager::showmenu(void)
- {
- cout << "********************" << endl;
- cout << "***** 0. exit ******" << endl;
- cout << "***** 1. add *******" << endl;
- cout << "***** 2. show ******" << endl;
- cout << "***** 3. delete ****" << endl;
- cout << "***** 4. revise ****" << endl;
- cout << "***** 5. search ****" << endl;
- cout << "***** 6. sort ******" << endl;
- cout << "***** 7. clear *****" << endl;
- cout << "********************" << endl;
- }
workmanager类的showmenu函数进行显示菜单功能。
- void workmanager::exitsystem(void)
- {
- cout << "Welcome to use again" << endl;
- system("pause");
- system("cls");
- }
workmanager类的exitsystem函数执行时表示要退出。
因为普通员工,经理和老板具有共性,因此用worker类作为父类,采用多态实现。
- #pragma once
- #include
- #include
- using namespace std;
- class worker {
- public:
- string number;
- string name;
- string depid;
- virtual void show(void) = 0;
- virtual string getname(void) = 0;
- };
这是worker.h的内容,worker类内有职工编号(number),职工姓名(name)和职工所在部门编号(depid)三个成员变量,这是普通员工,经理和老板的共性。show成员函数和getname函数也是共性,分别用于显示信息和获取身份。
- #pragma once
- #include
- #include
- #include"worker.h"
- using namespace std;
- class boss :public worker
- {
- public:
- boss();
- boss(string number, string name, string depid);
- void show(void);
- string getname(void);
- };
这是boss.h头文件的内容。定义了boss类。
- #include
- #include
- #include"worker.h"
- #include"boss.h"
- using namespace std;
- boss::boss() {}
- boss::boss (string number, string name, string depid)
- {
- this->number = number;
- this->name = name;
- this->depid = depid;
- }
-
- void boss::show(void)
- {
- cout << "The number is " << this->number << endl;
- cout << "The name is " << this->name << endl;
- cout << "The depart is " << this->getname() << endl;
- cout << "The duty is give assignment to manager and manage the whole company" << endl;
- }
-
- string boss::getname(void)
- {
- return "boss";
- }
这是boss.cpp的内容,重写了show和getname函数,并实现了构造函数。
- #pragma once
- #include
- #include
- #include"worker.h"
- using namespace std;
- class employee :public worker
- {
- public:
- employee();
- employee(string number, string name, string depid);
- void show(void);
- string getname(void);
- };
这是employee.h的内容,定义了employee类。
- #include
- #include
- #include"worker.h"
- #include"employee.h"
- using namespace std;
- employee::employee(){}
- employee::employee(string number, string name, string depid)
- {
- this->number = number;
- this->name = name;
- this->depid = depid;
- }
-
- void employee::show(void)
- {
- cout << "The number is " << this->number << endl;
- cout << "The name is " << this->name << endl;
- cout << "The depart is " << this->getname() << endl;
- cout << "The duty is finish assignment given by manager" << endl;
- }
-
- string employee::getname(void)
- {
- return "employee";
- }
这是employee.cpp的内容,重写了show和getname函数,并实现了构造函数。
- #pragma once
- #include
- #include
- #include"worker.h"
- using namespace std;
- class manager :public worker
- {
- public:
- manager();
- manager(string number, string name, string depid);
- void show(void);
- string getname(void);
- };
这是manager.h的内容,定义了manager类。
- #include
- #include
- #include"worker.h"
- #include"manager.h"
- using namespace std;
- manager::manager() {}
- manager::manager(string number, string name, string depid)
- {
- this->number = number;
- this->name = name;
- this->depid = depid;
- }
-
- void manager::show(void)
- {
- cout << "The number is " << this->number << endl;
- cout << "The name is " << this->name << endl;
- cout << "The depart is " << this->getname() << endl;
- cout << "The duty is finish assignment given by the boss and give assignment to employee" << endl;
- }
-
- string manager::getname(void)
- {
- return "manager";
- }
这是manager.cpp的内容,重写了show和getname函数,并实现了构造函数。
- void workmanager::addworker(void)
- {
- int thenumber;
- cout << "Please enter the number to add: " << endl;
- cin >> thenumber;
-
- while (thenumber <= 0) {
- cout << "Input error,Please enter a number bigger than 0" << endl;
- cout << "Please enter again: ";
- cin >> thenumber;
- }
-
- worker** temparray = new worker * [number + thenumber];
-
- int i;
- for (i = 0; i < number; i += 1) {
- temparray[i] = this->workertable[i];
- }
-
- for (i = 0; i < thenumber; i += 1) {
- cout << "Please enter the number" << endl;
- string tempnumber;
- while (true) {
- cin >> tempnumber;
- int j;
- bool flag = false;
- for (j = 0; j < number + i; j += 1) {
- if (temparray[j]->number == tempnumber) {
- cout << "It has repeated! Please enter again" << endl;
- flag = true;
- break;
- }
- }
-
- if (flag == false) {
- break;
- }
- }
-
- cout << "Please enter the name" << endl;
- string tempname;
- cin >> tempname;
- cout << "Please enter the depart" << endl;
- cout << "1.employee 2.manager 3.boss" << endl;
-
- while (true) {
- int tempdepart;
- cin >> tempdepart;
-
- if (tempdepart == 1) {
- temparray[number + i] = new employee(tempnumber, tempname, "employee");
- break;
- }
- else if (tempdepart == 2) {
- temparray[number + i] = new manager(tempnumber, tempname, "manager");
- break;
- }
- else if (tempdepart == 3) {
- temparray[number + i] = new boss(tempnumber, tempname, "boss");
- break;
- }
-
- else {
- cout << "Please enter 1,2 or 3" << endl;
- }
- }
- }
-
- delete[] workertable;
- workertable = temparray;
- number += thenumber;
- save();
-
- system("pause");
- system("cls");
- }
workmanager类的addworker函数要求用户添加信息,要求用户先输入要增加的数量,并限定至少输入1个用户。然后用堆区开辟空间,存放worker类指针,大小为原来的数量加上新增加的数量。随后首先将已有的数据拷贝至新空间中(workertable是存放信息的二级指针,关于从文件获取信息的内容在后面)。
随后要求按照前面给的数量输入信息,并且要求编号不能重复,对于职工类型,不同类型使用多态创建各自的指针。输入结束后释放workertable的空间,将函数创建的新数组temparray的空间赋给workertable。
save函数用于写入文件,内容在下面。
- void workmanager::save(void)
- {
- int i;
- ofstream ofs;
- ofs.open("information.txt", ios::out);
-
- for (i = 0; i < number; i += 1) {
- ofs << workertable[i]->number << " ";
- ofs << workertable[i]->name << " ";
- ofs << workertable[i]->depid << endl;
- }
- ofs.close();
- }
workmanager类的save成员函数进行写文件,将信息逐一写入。
在程序启动时,需要读取已有数据。这个操作可以在构造workmanager类的同时进行。
- workmanager::workmanager()
- {
- ifstream ifs;
- ifs.open("information.txt", ios::in);
-
- if (!ifs.is_open()) {
- cout << "It doesn't exit" << endl;
- ifs.close();
- number = 0;
- workertable = NULL;
- return;
- }
-
- char ch;
- ifs >> ch;
- if (ifs.eof()) {
- cout << "It is blank" << endl;
- ifs.close();
- number = 0;
- workertable = NULL;
- return;
- }
-
- number = 0;
- string tempnumber;
- string tempname;
- string tempdepid;
- while (ifs >> tempnumber && ifs >> tempname && ifs >> tempdepid) {
- number += 1;
- }
-
- workertable = NULL;
- ifs.close();
- init();
- }
这是workmanager的构造函数的内容。从文件中读取信息,如果文件不存在或无内容会结束构造函数,并将本类的number成员值置为0。(number成员表示员工个数)否则,会读取信息,并获得数量,然后利用init函数正式读入数据。
- void workmanager::init(void)
- {
- ifstream ifs;
- ifs.open("information.txt", ios::in);
- int i;
-
- string tempnumber;
- string tempname;
- string tempdepid;
- workertable = new worker * [number];
- for (i = 0; i < number; i += 1) {
- ifs >> tempnumber;
- ifs >> tempname;
- ifs >> tempdepid;
-
- if (tempdepid == "employee") {
- workertable[i] = new employee(tempnumber, tempname, "employee");
- }
- else if (tempdepid == "manager") {
- workertable[i] = new manager(tempnumber, tempname, "manager");
- }
- else if (tempdepid == "boss") {
- workertable[i] = new boss(tempnumber, tempname, "boss");
- }
- }
- ifs.close();
- }
workermanager类的init函数读取信息,并存入workertable。
由于整个程序内容较多,因此分成两篇笔记完成。