• 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类的全部内容,是对老板基本信息的操作。

    菜单和退出功能

    1. void workmanager::showmenu(void)
    2. {
    3. cout << "********************" << endl;
    4. cout << "***** 0. exit ******" << endl;
    5. cout << "***** 1. add *******" << endl;
    6. cout << "***** 2. show ******" << endl;
    7. cout << "***** 3. delete ****" << endl;
    8. cout << "***** 4. revise ****" << endl;
    9. cout << "***** 5. search ****" << endl;
    10. cout << "***** 6. sort ******" << endl;
    11. cout << "***** 7. clear *****" << endl;
    12. cout << "********************" << endl;
    13. }

    workmanager类的showmenu函数进行显示菜单功能。

    1. void workmanager::exitsystem(void)
    2. {
    3. cout << "Welcome to use again" << endl;
    4. system("pause");
    5. system("cls");
    6. }

    workmanager类的exitsystem函数执行时表示要退出。

    职工类

    因为普通员工,经理和老板具有共性,因此用worker类作为父类,采用多态实现。

    1. #pragma once
    2. #include
    3. #include
    4. using namespace std;
    5. class worker {
    6. public:
    7. string number;
    8. string name;
    9. string depid;
    10. virtual void show(void) = 0;
    11. virtual string getname(void) = 0;
    12. };

    这是worker.h的内容,worker类内有职工编号(number),职工姓名(name)和职工所在部门编号(depid)三个成员变量,这是普通员工,经理和老板的共性。show成员函数和getname函数也是共性,分别用于显示信息和获取身份。

    1. #pragma once
    2. #include
    3. #include
    4. #include"worker.h"
    5. using namespace std;
    6. class boss :public worker
    7. {
    8. public:
    9. boss();
    10. boss(string number, string name, string depid);
    11. void show(void);
    12. string getname(void);
    13. };

    这是boss.h头文件的内容。定义了boss类。

    1. #include
    2. #include
    3. #include"worker.h"
    4. #include"boss.h"
    5. using namespace std;
    6. boss::boss() {}
    7. boss::boss (string number, string name, string depid)
    8. {
    9. this->number = number;
    10. this->name = name;
    11. this->depid = depid;
    12. }
    13. void boss::show(void)
    14. {
    15. cout << "The number is " << this->number << endl;
    16. cout << "The name is " << this->name << endl;
    17. cout << "The depart is " << this->getname() << endl;
    18. cout << "The duty is give assignment to manager and manage the whole company" << endl;
    19. }
    20. string boss::getname(void)
    21. {
    22. return "boss";
    23. }

    这是boss.cpp的内容,重写了show和getname函数,并实现了构造函数。

    1. #pragma once
    2. #include
    3. #include
    4. #include"worker.h"
    5. using namespace std;
    6. class employee :public worker
    7. {
    8. public:
    9. employee();
    10. employee(string number, string name, string depid);
    11. void show(void);
    12. string getname(void);
    13. };

    这是employee.h的内容,定义了employee类。

    1. #include
    2. #include
    3. #include"worker.h"
    4. #include"employee.h"
    5. using namespace std;
    6. employee::employee(){}
    7. employee::employee(string number, string name, string depid)
    8. {
    9. this->number = number;
    10. this->name = name;
    11. this->depid = depid;
    12. }
    13. void employee::show(void)
    14. {
    15. cout << "The number is " << this->number << endl;
    16. cout << "The name is " << this->name << endl;
    17. cout << "The depart is " << this->getname() << endl;
    18. cout << "The duty is finish assignment given by manager" << endl;
    19. }
    20. string employee::getname(void)
    21. {
    22. return "employee";
    23. }

    这是employee.cpp的内容,重写了show和getname函数,并实现了构造函数。

    1. #pragma once
    2. #include
    3. #include
    4. #include"worker.h"
    5. using namespace std;
    6. class manager :public worker
    7. {
    8. public:
    9. manager();
    10. manager(string number, string name, string depid);
    11. void show(void);
    12. string getname(void);
    13. };

    这是manager.h的内容,定义了manager类。

    1. #include
    2. #include
    3. #include"worker.h"
    4. #include"manager.h"
    5. using namespace std;
    6. manager::manager() {}
    7. manager::manager(string number, string name, string depid)
    8. {
    9. this->number = number;
    10. this->name = name;
    11. this->depid = depid;
    12. }
    13. void manager::show(void)
    14. {
    15. cout << "The number is " << this->number << endl;
    16. cout << "The name is " << this->name << endl;
    17. cout << "The depart is " << this->getname() << endl;
    18. cout << "The duty is finish assignment given by the boss and give assignment to employee" << endl;
    19. }
    20. string manager::getname(void)
    21. {
    22. return "manager";
    23. }

    这是manager.cpp的内容,重写了show和getname函数,并实现了构造函数。

    添加职工功能

    1. void workmanager::addworker(void)
    2. {
    3. int thenumber;
    4. cout << "Please enter the number to add: " << endl;
    5. cin >> thenumber;
    6. while (thenumber <= 0) {
    7. cout << "Input error,Please enter a number bigger than 0" << endl;
    8. cout << "Please enter again: ";
    9. cin >> thenumber;
    10. }
    11. worker** temparray = new worker * [number + thenumber];
    12. int i;
    13. for (i = 0; i < number; i += 1) {
    14. temparray[i] = this->workertable[i];
    15. }
    16. for (i = 0; i < thenumber; i += 1) {
    17. cout << "Please enter the number" << endl;
    18. string tempnumber;
    19. while (true) {
    20. cin >> tempnumber;
    21. int j;
    22. bool flag = false;
    23. for (j = 0; j < number + i; j += 1) {
    24. if (temparray[j]->number == tempnumber) {
    25. cout << "It has repeated! Please enter again" << endl;
    26. flag = true;
    27. break;
    28. }
    29. }
    30. if (flag == false) {
    31. break;
    32. }
    33. }
    34. cout << "Please enter the name" << endl;
    35. string tempname;
    36. cin >> tempname;
    37. cout << "Please enter the depart" << endl;
    38. cout << "1.employee 2.manager 3.boss" << endl;
    39. while (true) {
    40. int tempdepart;
    41. cin >> tempdepart;
    42. if (tempdepart == 1) {
    43. temparray[number + i] = new employee(tempnumber, tempname, "employee");
    44. break;
    45. }
    46. else if (tempdepart == 2) {
    47. temparray[number + i] = new manager(tempnumber, tempname, "manager");
    48. break;
    49. }
    50. else if (tempdepart == 3) {
    51. temparray[number + i] = new boss(tempnumber, tempname, "boss");
    52. break;
    53. }
    54. else {
    55. cout << "Please enter 1,2 or 3" << endl;
    56. }
    57. }
    58. }
    59. delete[] workertable;
    60. workertable = temparray;
    61. number += thenumber;
    62. save();
    63. system("pause");
    64. system("cls");
    65. }

    workmanager类的addworker函数要求用户添加信息,要求用户先输入要增加的数量,并限定至少输入1个用户。然后用堆区开辟空间,存放worker类指针,大小为原来的数量加上新增加的数量。随后首先将已有的数据拷贝至新空间中(workertable是存放信息的二级指针,关于从文件获取信息的内容在后面)。

    随后要求按照前面给的数量输入信息,并且要求编号不能重复,对于职工类型,不同类型使用多态创建各自的指针。输入结束后释放workertable的空间,将函数创建的新数组temparray的空间赋给workertable。

    save函数用于写入文件,内容在下面。

    写文件

    1. void workmanager::save(void)
    2. {
    3. int i;
    4. ofstream ofs;
    5. ofs.open("information.txt", ios::out);
    6. for (i = 0; i < number; i += 1) {
    7. ofs << workertable[i]->number << " ";
    8. ofs << workertable[i]->name << " ";
    9. ofs << workertable[i]->depid << endl;
    10. }
    11. ofs.close();
    12. }

    workmanager类的save成员函数进行写文件,将信息逐一写入。

    读文件

    在程序启动时,需要读取已有数据。这个操作可以在构造workmanager类的同时进行。

    1. workmanager::workmanager()
    2. {
    3. ifstream ifs;
    4. ifs.open("information.txt", ios::in);
    5. if (!ifs.is_open()) {
    6. cout << "It doesn't exit" << endl;
    7. ifs.close();
    8. number = 0;
    9. workertable = NULL;
    10. return;
    11. }
    12. char ch;
    13. ifs >> ch;
    14. if (ifs.eof()) {
    15. cout << "It is blank" << endl;
    16. ifs.close();
    17. number = 0;
    18. workertable = NULL;
    19. return;
    20. }
    21. number = 0;
    22. string tempnumber;
    23. string tempname;
    24. string tempdepid;
    25. while (ifs >> tempnumber && ifs >> tempname && ifs >> tempdepid) {
    26. number += 1;
    27. }
    28. workertable = NULL;
    29. ifs.close();
    30. init();
    31. }

    这是workmanager的构造函数的内容。从文件中读取信息,如果文件不存在或无内容会结束构造函数,并将本类的number成员值置为0。(number成员表示员工个数)否则,会读取信息,并获得数量,然后利用init函数正式读入数据。

    1. void workmanager::init(void)
    2. {
    3. ifstream ifs;
    4. ifs.open("information.txt", ios::in);
    5. int i;
    6. string tempnumber;
    7. string tempname;
    8. string tempdepid;
    9. workertable = new worker * [number];
    10. for (i = 0; i < number; i += 1) {
    11. ifs >> tempnumber;
    12. ifs >> tempname;
    13. ifs >> tempdepid;
    14. if (tempdepid == "employee") {
    15. workertable[i] = new employee(tempnumber, tempname, "employee");
    16. }
    17. else if (tempdepid == "manager") {
    18. workertable[i] = new manager(tempnumber, tempname, "manager");
    19. }
    20. else if (tempdepid == "boss") {
    21. workertable[i] = new boss(tempnumber, tempname, "boss");
    22. }
    23. }
    24. ifs.close();
    25. }

    workermanager类的init函数读取信息,并存入workertable。

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

  • 相关阅读:
    分布式架构的高性能与可用性
    二进制转换16进制 快速心算
    【Java面试】来讲一讲你对String的理解
    13--Django-cookie、session的介绍与使用
    Word控件Spire.Doc 【图像形状】教程(7): 如何使用 C# 在 Word 中替换图像
    【pytorch】有关nn.EMBEDDING的简单介绍
    serialVersionUID的重要性,及Idea自动生成 serialVersionUID的设置
    Rust错误处理和Result枚举类异常错误传递
    算法——二叉树应用
    Spring+Vue增删改查实例
  • 原文地址:https://blog.csdn.net/m0_71007572/article/details/126360250