在完成对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<iostream>
#include<string>
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<iostream>
#include<string>
#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<iostream>
#include<string>
#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<iostream>
#include<string>
#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<iostream>
#include<string>
#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<iostream>
#include<string>
#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<iostream>
#include<string>
#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。
由于整个程序内容较多,因此分成两篇笔记完成。