基于C++泛型编程职工管理系统

目录
  • 一、泛型编程思想
  • 二、单链表是什么?
    • 1.图示
    • 2.链表的节点结构【节点类】
    • 3.链表类
  • 三、泛型编程核心
    • 1.实现数据类
    • 2.实现链表类
  • 四、运行截图
    • 1.主菜单
    • 2.查看信息
    • 3.更换数据类型
    • 4.再次显示所有信息【抛转】
  • 五、源码

前言:

前面介绍到了C++的泛型编程,并实现了万能容器,不过那使用的是数组,今天呢咱带大家实践一下使用泛型技术,结合单链表实现一个职工管理系统。保证大家看完之后有所感悟。

一、泛型编程思想

所谓泛型就是类型不固定,只需修改少量代码就可以扩展为其他类型的应用,由于C++是一门静态编译型的语言,变量的类型都是事先编译好的,如果不用泛型进行编程,一段代码始终就是那么点作用。使用泛型编程后,可以很简单的对其他类型进行扩展。泛型编程核心思想就是将数据类型设置为模板,第一次编译是对模板进行编译,第二次编译会带入人为传的类型参数。前面文章有讲函数模板与类模板,忘记的小伙伴可以去看看。

二、单链表是什么?

单链表中的单代表一条,链表意思就是一个个节点链接起来的表结构。
其最典型的特征就是节点只有一个指针域。并且该指针域指向下一节点的地址

1.图示

  • 链表中的第一个节点被称为头结点,一般不存储数据,指向头结点的指针称为头指针
  • 第一个存储数据的节点称为首节点,末尾节点称为尾节点,指针域赋空,防止变为野指针。

2.链表的节点结构【节点类】

①常规链表节点

  • 包含数据域,指针域。指针域指针类型与节点类型保持一致。
class node {
private:
    //数据域
    string data1;
    string data2;
    //指针域
    node* next;
public:
    node() {
    }
}

②泛型链表节点

其中T代表的是一种不确定的数据类型,data是一个T类型的对象,其作用类似于结构体存储数据域的信息,但是在c++中他必须用类实现,因为该数据类型要有属于自己的属性与方法。node* next代表一个T类型的node指针,其本质还是node指针,只不过T的类型决定着node *指向的节点中的data的类型。

代码如下:

template<typename T>
class node {
private:
    //数据域
    T data;
    //指针域
    node<T>* next;
public:
    node() {
    }
}

3.链表类

常规链表类中需要包含一个头指针,指向链表的头结点,然后创建一个链表对其增删改查泛型编程中的链表类,也要是一个链表类。实现类型的参数化,具体如下:

template<typename T>
class link {
private:
    //传入类型的时候,先传给link然后link会传给node;
    node<T>* head;
public:
    link() {
    }
    bool add(){
    }
    bool del(){
    }
    

三、泛型编程核心

1.实现数据类

泛型就是要将你写的类型,像对待int string类型那样对待。首先要进行的就是运算符重载重载了运算符你可以使用cin,cout直接对相应的对象进行输入,输出。可以直接使用=进行赋值。

具体实现如下:

class officer
{
    //重载了标准输入输出流函数、文件输入输出流函数(可以直接存文件)
    friend ostream& operator<<(ostream& out, officer& obj);
    friend istream& operator>>(istream& in, officer& obj);
    friend ofstream& operator<<(ofstream& outfile, officer& obj);//--------输出到文件
    friend ifstream& operator>>(ifstream& infile, officer& obj);//---------读取文件
private:
    string id_card;
    string name;
    string sex;
    int age;
    string post;
    int money;
public://---------------------------------私有属性管理方法
    officer() {
        id_card = "";
        name = "";
        sex = "";
        age = 0;
        post = "";
        money = 0;
    }
    //拷贝构造函数结合赋值函数,直接进行赋值。
    officer(officer& obj) {
        this->id_card = obj.getid();
        this->name = obj.getname();
        this->sex = obj.getsex();
        this->age = obj.getage();
        this->money = obj.getmoney();
        this->post = obj.getpost();
    }
    officer& operator=(officer& obj) {
        this->id_card = obj.getid();
        this->name = obj.getname();
        this->sex = obj.getsex();
        this->age = obj.getage();
        this->money = obj.getmoney();
        this->post = obj.getpost();
        return *this;
    }
    //查重时使用
    bool operator==(officer& obj) {
        if (this->getid() == obj.getid() && this->getname() == obj.getname() && this->getsex() == obj.getsex()\
            && this->getage() == obj.getage() && this->getpost() == obj.getpost() && this->getmoney() == obj.getmoney()) {
            return true;
        }
        return false;
    }
    bool operator!=(officer& obj) {
        if (this->getid() == obj.getid()) {
            return false;
        }
        return true;
    }
    //排序时使用,根据工资的高低。
    bool operator>(officer& obj) {
        if (this->getmoney() > obj.getmoney()) {
            return true;
        }
        return false;
    }
    bool operator<(officer& obj) {
        if (this->getmoney() < obj.getmoney()) {
            return true;
        }
        return false;
    }
    void setpost(string post) {
        this->post = post;
    }
    void setmoney(int money) {
        this->money = money;
    }
    void setid(string id) {
        id_card = id;
    }
    void setname(string name) {
        this->name = name;
    }
    void setsex(string sex) {
        this->sex = sex;
    }
    void setage(int age) {
        this->age = age;
    }
    string getid() {
        return id_card;
    }
    string getname() {
        return name;
    }
    string getsex() {
        return sex;
    }
    int getage() {
        return age;
    }
    string getpost() {
        return post;
    }
    int getmoney() {
        return money;
    }
};

2.实现链表类

泛型的链表类、节点类一般就是写死的,做到换一个数据类还可以用的效果所以在泛型链表类中的提示性语句要有一定的泛化程度,不可以针对某种类型提示。

template<typename T>
class link {
private:
    node<T>* head;
public:
    link() {
        string classname;
        ifstream infile;
        node<T>* p, * q;
        p = new node<T>;
        p->setnext(NULL);
        head = new node<T>;
        head->setnext(NULL);
        q = head;
        classname = head->GetClass();
        classname.erase(remove(classname.begin(), classname.end(), '<'), classname.end());
        classname.erase(remove(classname.begin(), classname.end(), '>'), classname.end());
        //cout << classname << endl;
        infile.open(classname);
        while (infile >> p->opedata()) {
            q->setnext(p);
            q = q->getnext();
            p = new node<T>;
            p->setnext(NULL);
        }
        delete p;
        infile.close();
    }
    void addnode() {//-------------------------增
        node<T>* p, * q;
        p = new node<T>;
        p->setnext(NULL);
        cout << "请输入您要存储的数据:" << endl;
        cin >> p->opedata();
        q = head;
        for (; q->getnext() != NULL; q = q->getnext()) {
            if (q->getnext()->opedata() == p->opedata()) {
                cout << "您输入的数据,已存在,不需要重复录入" << endl;
                system("pause");
                delete p;
                return;
            }
        }
        q->setnext(p);
        savelink();
        cout << "存储成功!" << endl;
        system("pause");
    }
    void delnode() {//---------------------------删
        bool k = false;
        node<T>* p, * q, * r;
        p = new node<T>;
        p->setnext(NULL);
        cout << "请输入您要删除的数据" << endl;
        cin >> p->opedata();
        q = head;
        for (; q->getnext() != NULL; q = q->getnext()) {
            if (q->getnext()->opedata() == p->opedata() && q->getnext()->getnext() != NULL) {
                r = q->getnext();
                q->getnext() = q->getnext()->getnext();
                delete r;
                k = true;
                break;
            }
            else if (q->getnext()->opedata() == p->opedata() && q->getnext()->getnext() == NULL) {
                r = q->getnext();
                delete r;
                q->setnext(NULL);
                k = true;
                break;
            }
        }
        if (k == false) {
            cout << "没有找到您要删除的数据,请核实后再来!" << endl;

        }
        else if (k == true) {
            savelink();
            cout << "删除成功!" << endl;
        }
        delete p;
        system("pause");
        return;
    }
    void altenode() {//-------------------------------改
        int judgecin = 0;
        bool k = false;
        node<T>* p, * q, * r;
        p = new node<T>;
        p->setnext(NULL);
        cout << "请输入您要改动的数据" << endl;
        judgecin = 1;
        cin >> p->opedata();
        judgecin = 0;
        q = head;
        for (; q->getnext() != NULL; q = q->getnext()) {
            if (q->getnext()->opedata() == p->opedata()) {
                cout << "请输入新的数据:" << endl;
            rewrite:
                cin >> p->opedata();
                for (r = head; r->getnext() != NULL; r = r->getnext()) {
                    if (r->getnext()->opedata() == p->opedata() && p->opedata() != q->getnext()->opedata()) {
                        system("cls");
                        judgecin++;
                        if (judgecin == 3) {
                            cout << "您多次输入信息错误,请核实后再来,将要返回主菜单" << endl;
                            delete p;
                            system("pause");
                            return;
                        }
                        cout << "请输入您自己的身份信息!或输入新的身份证号" << endl;
                        goto rewrite;
                    }
                }
                q->getnext()->opedata() = p->opedata();
                k = true;
            }
        }
        if (k == true) {
            savelink();
            cout << "修改成功!" << endl;
        }
        else {
            cout << "修改失败!没有找到该数据!" << endl;
        }
        delete p;
        system("pause");
        return;
    }
    void selnode() {//----------------------------------查
        cout << "请输入您要查找的数据" << endl;
        bool k = false;
        node<T>* p, * q;
        p = new node<T>;
        p->setnext(NULL);
        cin >> p->opedata();
        for (q = head; q->getnext() != NULL; q = q->getnext()) {
            if (q->getnext()->opedata() == p->opedata()) {
                k = true;
                cout << "您要查找的数据如下!" << endl;
                cout << q->getnext()->opedata() << endl;
                //break;
            }
        }
        if (k == false) {
            cout << "没有找到您要查找的数据!抱歉" << endl;
        }
        system("pause");
        return;
    }
    void printlink() {//------------------------------打印链表
        node<T>* p;
        sortlink();
        for (p = head; p->getnext() != NULL; p = p->getnext()) {
            cout << p->getnext()->opedata() << endl;
        }
        system("pause");
    }
    void sortlink() {//-------------------------------排序
        node<T>* p, * q;
        if (head->getnext() == NULL) {
            cout << "没有数据,无需排序!" << endl;
            return;
        }
        if (head->getnext()->getnext() == NULL) {
            cout << "一组数据,无需排序!" << endl;
            return;
        }
        for (p = head->getnext(); p->getnext() != NULL; p = p->getnext()) {
            for (q = p->getnext(); q != NULL; q = q->getnext()) {
                if (q->opedata() > p->opedata()) {
                    node<T> temp;
                    temp = *q;
                    *q = *p;
                    *p = temp;
                    temp.getnext() = q->getnext();
                    q->getnext() = p->getnext();
                    p->getnext() = temp.getnext();
                }
            }
        }
    }
    void savelink() {//--------------------------------------存链表
        ofstream outfile;
        string classname;
        node<T>* p;
        p = head;
        classname = head->GetClass();
        classname.erase(remove(classname.begin(), classname.end(), '<'), classname.end());
        classname.erase(remove(classname.begin(), classname.end(), '>'), classname.end());
        outfile.open(classname);
        while (p->getnext() != NULL) {
            p = p->getnext();
            outfile << p->opedata() << endl;
        }
        outfile.close();

    }
    ~link() {//--------------------------------------------销毁链表
        node<T>* p;
        p = head->getnext();
        while (p != NULL) {
            delete head;
            head = p;
            p = p->getnext();
        }
    }//
};

四、运行截图

1.主菜单

2.查看信息

3.更换数据类型

  • 将officer类型注释掉,使用int类型

4.再次显示所有信息【抛转】

  • 可以看到就算将officer类型换为int类型,程序依旧可以稳定的运行。
  • 这里打印职工信息系统的提示性语句出现到了这里,如果大家真的理解了泛型的思想
  • 肯定可以轻而易举的改掉这处不足,有什么想法的小伙伴评论区留言博主吧。

五、源码

char off_menu();
class officer;
int mynum(string str) {//-----------------判断字符串是否全为数字
    for (unsigned int i = 0; i < str.length(); i++) {
        if (!isdigit(str[i])) {
            return 1;
        }
    }
    return 0;
}
template<typename T>
class node {
private:
    T data;
    node<T>* next;
public:
    node() {
    }
    void setnext(node<T>* p) {
        if (p != NULL) {
            next = new node<T>;
            next->data = p->opedata();
            next->next = p->getnext();
        }
        else
            next = p;

    }
    T& opedata() {
        return data;
    }
    node<T>*& getnext() {
        return next;
    }
    const char* GetClass()
    {
        return typeid(*this).name();
    }
};
template<typename T>
class link {
private:
    node<T>* head;
public:
    link() {
        string classname;
        ifstream infile;
        node<T>* p, * q;
        p = new node<T>;
        p->setnext(NULL);
        head = new node<T>;
        head->setnext(NULL);
        q = head;
        classname = head->GetClass();
        classname.erase(remove(classname.begin(), classname.end(), '<'), classname.end());
        classname.erase(remove(classname.begin(), classname.end(), '>'), classname.end());
        //cout << classname << endl;
        infile.open(classname);
        while (infile >> p->opedata()) {
            q->setnext(p);
            q = q->getnext();
            p = new node<T>;
            p->setnext(NULL);
        }
        delete p;
        infile.close();
    }
    void addnode() {//-------------------------增
        node<T>* p, * q;
        p = new node<T>;
        p->setnext(NULL);
        cout << "请输入您要存储的数据:" << endl;
        cin >> p->opedata();
        q = head;
        for (; q->getnext() != NULL; q = q->getnext()) {
            if (q->getnext()->opedata() == p->opedata()) {
                cout << "您输入的数据,已存在,不需要重复录入" << endl;
                system("pause");
                delete p;
                return;
            }
        }
        q->setnext(p);
        savelink();
        cout << "存储成功!" << endl;
        system("pause");
    }
    void delnode() {//---------------------------删
        bool k = false;
        node<T>* p, * q, * r;
        p = new node<T>;
        p->setnext(NULL);
        cout << "请输入您要删除的数据" << endl;
        cin >> p->opedata();
        q = head;
        for (; q->getnext() != NULL; q = q->getnext()) {
            if (q->getnext()->opedata() == p->opedata() && q->getnext()->getnext() != NULL) {
                r = q->getnext();
                q->getnext() = q->getnext()->getnext();
                delete r;
                k = true;
                break;
            }
            else if (q->getnext()->opedata() == p->opedata() && q->getnext()->getnext() == NULL) {
                r = q->getnext();
                delete r;
                q->setnext(NULL);
                k = true;
                break;
            }
        }
        if (k == false) {
            cout << "没有找到您要删除的数据,请核实后再来!" << endl;

        }
        else if (k == true) {
            savelink();
            cout << "删除成功!" << endl;
        }
        delete p;
        system("pause");
        return;
    }
    void altenode() {//-------------------------------改
        int judgecin = 0;
        bool k = false;
        node<T>* p, * q, * r;
        p = new node<T>;
        p->setnext(NULL);
        cout << "请输入您要改动的数据" << endl;
        judgecin = 1;
        cin >> p->opedata();
        judgecin = 0;
        q = head;
        for (; q->getnext() != NULL; q = q->getnext()) {
            if (q->getnext()->opedata() == p->opedata()) {
                cout << "请输入新的数据:" << endl;
            rewrite:
                cin >> p->opedata();
                for (r = head; r->getnext() != NULL; r = r->getnext()) {
                    if (r->getnext()->opedata() == p->opedata() && p->opedata() != q->getnext()->opedata()) {
                        system("cls");
                        judgecin++;
                        if (judgecin == 3) {
                            cout << "您多次输入信息错误,请核实后再来,将要返回主菜单" << endl;
                            delete p;
                            system("pause");
                            return;
                        }
                        cout << "请输入您自己的身份信息!或输入新的身份证号" << endl;
                        goto rewrite;
                    }
                }
                q->getnext()->opedata() = p->opedata();
                k = true;
            }
        }
        if (k == true) {
            savelink();
            cout << "修改成功!" << endl;
        }
        else {
            cout << "修改失败!没有找到该数据!" << endl;
        }
        delete p;
        system("pause");
        return;
    }
    void selnode() {//----------------------------------查
        cout << "请输入您要查找的数据" << endl;
        bool k = false;
        node<T>* p, * q;
        p = new node<T>;
        p->setnext(NULL);
        cin >> p->opedata();
        for (q = head; q->getnext() != NULL; q = q->getnext()) {
            if (q->getnext()->opedata() == p->opedata()) {
                k = true;
                cout << "您要查找的数据如下!" << endl;
                cout << q->getnext()->opedata() << endl;
                //break;
            }
        }
        if (k == false) {
            cout << "没有找到您要查找的数据!抱歉" << endl;
        }
        system("pause");
        return;
    }
    void printlink() {//------------------------------打印链表
        node<T>* p;
        sortlink();
        for (p = head; p->getnext() != NULL; p = p->getnext()) {
            cout << p->getnext()->opedata() << endl;
        }
        system("pause");
    }
    void sortlink() {//-------------------------------排序
        node<T>* p, * q;
        if (head->getnext() == NULL) {
            cout << "没有数据,无需排序!" << endl;
            return;
        }
        if (head->getnext()->getnext() == NULL) {
            cout << "一组数据,无需排序!" << endl;
            return;
        }
        for (p = head->getnext(); p->getnext() != NULL; p = p->getnext()) {
            for (q = p->getnext(); q != NULL; q = q->getnext()) {
                if (q->opedata() > p->opedata()) {
                    node<T> temp;
                    temp = *q;
                    *q = *p;
                    *p = temp;
                    temp.getnext() = q->getnext();
                    q->getnext() = p->getnext();
                    p->getnext() = temp.getnext();
                }
            }
        }
    }
    void savelink() {//--------------------------------------存链表
        ofstream outfile;
        string classname;
        node<T>* p;
        p = head;
        classname = head->GetClass();
        classname.erase(remove(classname.begin(), classname.end(), '<'), classname.end());
        classname.erase(remove(classname.begin(), classname.end(), '>'), classname.end());
        outfile.open(classname);
        while (p->getnext() != NULL) {
            p = p->getnext();
            outfile << p->opedata() << endl;
        }
        outfile.close();

    }
    ~link() {//--------------------------------------------销毁链表
        node<T>* p;
        p = head->getnext();
        while (p != NULL) {
            delete head;
            head = p;
            p = p->getnext();
        }
    }//
};
class officer
{
    friend ostream& operator<<(ostream& out, officer& obj);
    friend istream& operator>>(istream& in, officer& obj);
    friend ofstream& operator<<(ofstream& outfile, officer& obj);//--------输出到文件
    friend ifstream& operator>>(ifstream& infile, officer& obj);//---------读取文件
private:
    string id_card;
    string name;
    string sex;
    int age;
    string post;
    int money;
public://---------------------------------私有属性管理方法
    officer() {
        id_card = "";
        name = "";
        sex = "";
        age = 0;
        post = "";
        money = 0;
    }
    officer(officer& obj) {
        this->id_card = obj.getid();
        this->name = obj.getname();
        this->sex = obj.getsex();
        this->age = obj.getage();
        this->money = obj.getmoney();
        this->post = obj.getpost();
    }
    officer& operator=(officer& obj) {
        this->id_card = obj.getid();
        this->name = obj.getname();
        this->sex = obj.getsex();
        this->age = obj.getage();
        this->money = obj.getmoney();
        this->post = obj.getpost();
        return *this;
    }
    bool operator==(officer& obj) {
        if (this->getid() == obj.getid() && this->getname() == obj.getname() && this->getsex() == obj.getsex()\
            && this->getage() == obj.getage() && this->getpost() == obj.getpost() && this->getmoney() == obj.getmoney()) {
            return true;
        }
        return false;
    }
    bool operator!=(officer& obj) {
        if (this->getid() == obj.getid()) {
            return false;
        }
        return true;
    }
    bool operator>(officer& obj) {
        if (this->getmoney() > obj.getmoney()) {
            return true;
        }
        return false;
    }
    bool operator<(officer& obj) {
        if (this->getmoney() < obj.getmoney()) {
            return true;
        }
        return false;
    }
    void setpost(string post) {
        this->post = post;
    }
    void setmoney(int money) {
        this->money = money;
    }
    void setid(string id) {
        id_card = id;
    }
    void setname(string name) {
        this->name = name;
    }
    void setsex(string sex) {
        this->sex = sex;
    }
    void setage(int age) {
        this->age = age;
    }
    string getid() {
        return id_card;
    }
    string getname() {
        return name;
    }
    string getsex() {
        return sex;
    }
    int getage() {
        return age;
    }
    string getpost() {
        return post;
    }
    int getmoney() {
        return money;
    }
};
ostream& operator<<(ostream& out, officer& obj) {
    out << obj.getid() << "\t";
    out << obj.getname() << "\t";
    out << obj.getsex() << "\t";
    out << obj.getage() << "\t";
    out << obj.getpost() << "\t";
    out << obj.getmoney() << "\t";
    //    cout << endl;
    return out;
}
istream& operator>>(istream& in, officer& obj) {
    cout << "身份证(18位):";
id_here:
    in >> obj.id_card;
    if (obj.getid() == "00") {
        return in;
    }
    else if (obj.getid().length() != 18) {
        cout << "输入格式不规范请重新输入:";
        goto id_here;
    }
    //if (judgecin == 1) {
    //    return in;
    //}
    cout << "姓名:";
    in >> obj.name;
    cout << "性别:";
sex_here:
    in >> obj.sex;
    if (obj.getid() == "00") {
        return in;
    }
    else if (obj.getsex() != "男" && obj.getsex() != "女") {
        cout << "请输入准确的性别:";
        goto sex_here;
    }
    cout << "年龄:";
    string age;
age_here:
    in >> age;
    if (obj.getid() == "00") {
        return in;
    }
    else if (mynum(age) || age.length() > 3) {
        cout << "输入不规范请重新输入:";
        goto age_here;
    }
    obj.age = atoi(age.c_str());
    cout << "职位:";
post_here:
    in >> obj.post;
    if (obj.getid() == "00") {
        return in;
    }
    else if (obj.getpost() != "监狱长" && obj.getpost() != "探长" && \
        obj.getpost() != "参谋长" && obj.getpost() != "大警司" && obj.getpost() != "小警司") {
        cout << "请输入职位(监狱长,探长,参谋长,大警司,小警司):";
        goto post_here;
    }
    if (obj.getpost() == "监狱长") {
        obj.money = 30000;
    }
    else if (obj.getpost() == "探长") {
        obj.money = 24000;
    }
    else if (obj.getpost() == "参谋长") {
        obj.money = 24500;
    }
    else if (obj.getpost() == "大警司") {
        obj.money = 20000;
    }
    else if (obj.getpost() == "小警司") {
        obj.money = 18000;
    }
    return in;
}
ofstream& operator<<(ofstream& outfile, officer& obj) {
    outfile << obj.getid() << " " << obj.getname() << " " << obj.getsex() << " " << obj.getage()\
        << " " << obj.getpost() << " " << obj.getmoney();// << endl;
    return outfile;
}
ifstream& operator>>(ifstream& infile, officer& obj) {
    string post1;
    int money1;
    string id1;
    string name1;
    string sex1;
    int age1;
    infile >> id1 >> name1 >> sex1 >> age1 >> post1 >> money1;
    obj.setid(id1);
    obj.setname(name1);
    obj.setsex(sex1);
    obj.setage(age1);
    obj.setpost(post1);
    obj.setmoney(money1);
    return infile;
}
int main() {
    //link<officer> myarray;
    link<int> myarray;

    char menun;
    while (1) {
        menun = off_menu();
        if (menun == '1') {
            system("cls");
            int len;
            cout << "请输入您要增加节点的个数:";
            cin >> len;
            for (int i = 0; i < len; i++) {
                myarray.addnode();
                system("cls");
            }
        }
        else if (menun == '2') {
            myarray.delnode();
        }
        else if (menun == '3') {
            myarray.altenode();
        }
        else if (menun == '4') {
            myarray.selnode();
        }
        else if (menun == '5') {
            cout << "身份证\t\t\t姓名\t性别\t年龄\t职位\t工资" << endl;
            myarray.printlink();
        }
        else if (menun == '6') {
            break;
        }
        system("cls");
    }
    return 0;
}
char off_menu() {
    char n;
    n = '0';
    system("cls");
    cout << "\n\n\n";
    cout << "\t\t\t\t\t-------欢迎使用本信息管理系统-------" << endl; cout << "\t\t\t\t\t*\t     \t\t\t   *" << endl;
    cout << "\t\t\t\t\t*\t   1.录入员工信息\t   *" << endl; cout << "\t\t\t\t\t*\t     \t\t\t   *" << endl;
    cout << "\t\t\t\t\t*\t   2.删除员工信息\t   *" << endl; cout << "\t\t\t\t\t*\t     \t\t\t   *" << endl;
    cout << "\t\t\t\t\t*\t   3.修改员工信息\t   *" << endl; cout << "\t\t\t\t\t*\t     \t\t\t   *" << endl;
    cout << "\t\t\t\t\t*\t   4.查询员工信息\t   *" << endl; cout << "\t\t\t\t\t*\t     \t\t\t   *" << endl;
    cout << "\t\t\t\t\t*\t   5.查看员工信息\t   *" << endl; cout << "\t\t\t\t\t*\t     \t\t\t   *" << endl;
    cout << "\t\t\t\t\t*\t   6.退出该系统\t\t   *" << endl; cout << "\t\t\t\t\t*\t     \t\t\t   *" << endl;
    cout << "\t\t\t\t\t------------------------------------" << endl;
    cout << "———————————————————————————————————————————————————————----------" << endl;
    cout << "———————————————————————————————————————————————————————----------" << endl;
    cout << "please your choose:";
    while (1) {
        n = _getch();
        if (n >= '1' && n <= '6') {
            break;
        }
    }
    cout << endl;
    return n;
}

总结:
理解了泛型会对python等解释性语言有更好的理解。希望大家能够好好理解这个项目,在博主的基础之上更上一层楼

到此这篇关于基于C++泛型编程职工管理系统的文章就介绍到这了,更多相关C++泛型编程职工管理系统内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中类模板的应用你了解多少

    目录 类模板应用 数组类的封装 Int的.hpp文件 int的测试文件 Person类的.hpp文件 Person类的测试文件 总结 类模板应用 数组类的封装 属性: 1,T *pAddress 指向堆区数组的指针. 2,int m_Capacity 数组容量 3,int m_Size 数组大小 行为: 1,myArray(int capacity) 构造函数 2,myArray(const MyArray&arr) 拷贝构造函数 3,operator= 重载赋值操作符= 4,operator[

  • C++泛型编程Generic Programming的使用

    目录 一.容器 array vector deque list map 键值对key/value 二.迭代器iterator(泛型指针) 三.泛型算法Generic Programming insert()插入 erase()删除 find()用于无序搜索,搜素范围[first, last), 返回iterator, 找不到则返回last copy() 复制 泛型编程最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库. 所谓通用的标准容器库,就是要能够做到,比如用一个

  • C++函数模板的使用详解

    函数模板可以适用泛型来定义函数,其中泛型可以是(int, double, float)等替换.在函数重载过程中,通过将类型作为参数传递给模板,可使编译器自动产生该类型的函数. 工作原理:比如需要定义一个比大小的max函数,有三种类型的数据(int,double,float),可能就需要编写三个函数,这样既浪费时间,且容易出错.如: #include <iostream> using namespace std; int Max(int a, int b); double Max(double

  • C++函数模板介绍

    文章转自: 公众号:Coder梁(ID:Coder_LT) 函数模板: 所谓函数的模板,本质上也就是使用泛型来定义函数. 所谓的泛型其实也就是不定的类型,比如说我们使用vector的时候,可以定义各种类型的vector,可以定义存储int型的vector也可以定义存储float类型的,也可以定义存储其他类型.我们在声明的时候将存储的类型当做参数传给了模板. 泛型可以用具体的类型,比如(int或double)替换,通过将类型作为参数传给模板,编译器会根据传递的参数类型生成该类型的函数.这种方式也被

  • C++ 函数模板和类模板详情

    目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式化 2.3 函数模板原理 2.4 函数模板实例化 2.5 模板参数的匹配原理 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 1. 泛型编程 如何实现一个通用的交换函数? 在C++中可以用到函数重载 class A { public: void Swap(int& x1,int& x2) { int temp=x1; x1=x2; x2=temp; } void Swap(double&

  • C++泛型编程函(数模板+类模板)

    目录 一.函数模板 1.函数模板介绍 2.函数模板与重载函数的关系 3.函数模板实现机制 二.类模板 1.类模板基本语法 2.类模板内函数的整体布局[分文件使用类模板] 3.类模板的static与模板类的static 4.数组实现万能容器 前言: 由于C++是静态语言,也就是说使用一个数据的时候必须先指定类型,这样的操作在编译后变量的类型是无法轻易改变的,就导致扩展性太差.或者一个函数需要很多次重载的时候,代码显得冗杂,由此产生了C++函数模板. 一.函数模板 1.函数模板介绍 ① 函数模板的产

  • C++模板基础之函数模板与类模板实例详解

    泛型编程  如果让你编写一个函数,用于两个数的交换.在C语言中,我们会用如下方法: // 交换两个整型 void Swapi(int* p1, int* p2) { int tmp = *p1; *p1 = *p2; *p2 = tmp; } // 交换两个双精度浮点型 void Swapd(double* p1, double* p2) { double tmp = *p1; *p1 = *p2; *p2 = tmp; }  因为C语言不支持函数重载,所以用于交换不同类型变量的函数的函数名是不

  • 基于C++泛型编程职工管理系统

    目录 一.泛型编程思想 二.单链表是什么? 1.图示 2.链表的节点结构[节点类] 3.链表类 三.泛型编程核心 1.实现数据类 2.实现链表类 四.运行截图 1.主菜单 2.查看信息 3.更换数据类型 4.再次显示所有信息[抛转] 五.源码 前言: 前面介绍到了C++的泛型编程,并实现了万能容器,不过那使用的是数组,今天呢咱带大家实践一下使用泛型技术,结合单链表实现一个职工管理系统.保证大家看完之后有所感悟. 一.泛型编程思想 所谓泛型就是类型不固定,只需修改少量代码就可以扩展为其他类型的应用

  • 基于C++实现职工管理系统

    本文实例为大家分享了C++实现职工管理系统的具体代码,供大家参考,具体内容如下 1.管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 利用C++来实现一个基于多态的职工管理系统 公司中职工分为三类:普通员工.经理.老板,显示信息时,需要显示职工编号.职工姓名.职工岗位.以及职责 普通员工职责:完成经理交给的任务 经理职责:完成老板交给的任务,并下发任务给员工 老板职责:管理公司所有事务 管理系统中需要实现的功能如下: 退出管理程序:退出当前管理系统 增加职工信息:实现批量添加职工功能,

  • C++实现简单的职工管理系统实训代码

    本文实例为大家分享了C++职工管理系统实例代码 1.单个职工的头文件 staff.h #ifndef STAFF_H_INCLUDED #define STAFF_H_INCLUDED //结构体创建 struct staff { char ID[10]; char name[10]; char sex[10]; int pay; int reward; int factpay; }; //自定义结构体 typedef struct staff staff; //单个职工信息创建 staff C

  • Java基于MySQL实现学生管理系统

    本文为大家分享了Java基于MySQL实现学生管理系统,供大家参考,具体内容如下 因为实验室要交作业然后就做了一个学生管理系统,贴个代码纪念一下,做的太急界面什么的也比较差. 还有一些小细节没有完善不过还是能实现主要的功能的. Window是主界面 package First; import java.sql.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Window { pub

  • Python基于mysql实现学生管理系统

    本篇文章主要介绍了Python基于mysql实现学生管理系统,分享给大家,具体如下: import pymysql import re def idinput(string): ID = input(string) pattern = re.compile("^\d{1,3}$") while not re.match(pattern, ID): ID = input("请输入1-3位整数:") return ID def appendStudentInfo():

  • C语言实现职工管理系统

    小编找到了一个特别好的职工管理系统,分享给大家一份C语言职工管理系统的具体实现代码,供大家参考,也谢谢这位网友的分享,具体内容如下 person.cpp #include "person.h" //首页 int Print_Head(int * num) { printf("\t***********************************************\n"); printf("\t| 职工管理系统 |\n"); printf

  • C++实现简单职工管理系统

    本文实例为大家分享了C++职工管理系统实例代码,供大家参考,具体内容如下 1.单个职工的头文件 staff.h #ifndef STAFF_H_INCLUDED #define STAFF_H_INCLUDED //结构体创建 struct staff { char ID[10]; char name[10]; char sex[10]; int pay; int reward; int factpay; }; //自定义结构体 typedef struct staff staff; //单个职

  • C++利用多态实现职工管理系统(项目开发)

    分析 首先看一下这个项目的文件: 主要分为两部分: 主体部分: main.cpp和workManager.h,workManager.cpp职工部分(这里采用多态的方式编写): 主要是worker.h和worker.cpp 三种职位:boss,employee,manager 经过分析是否大概知道了其中各部分的意思呢? 看起来这里面有很多,但是正是这种多个文件编写才时代码更加简洁. 所以在正式写项目之前一定要先考虑好整体架构,在进行编写. 项目整体架构: 这个项目的难度并不大,主要是要学会这个项

  • 基于python实现银行管理系统

    一.python银行管理系统 二.分析部分 三.代码部分 import random class bankUser: # 卡号,用户姓名,身份证号,手机,预存,密码 Count_id = "" Count_Name = "" Count_IDCard = "" Count_phone = "" Count_Money = 0.00 Count_password = "" Count_Root = True

  • C++实现职工管理系统

    本文实例为大家分享了C++实现职工管理系统的具体代码,供大家参考,具体内容如下 workermanager.h #pragma once//防止头文件重复包含 #include <iostream> #include "worker.h" using namespace std; #include "boss.h" #include "employee.h" #include "manager.h" #includ

随机推荐