C++学习笔记(十八)

在完成对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。

由于整个程序内容较多,因此分成两篇笔记完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值