C++程序設計實驗 僱員工資管理系統 員工管理系統

  • 課程設計內容

  • 課題描述

本系統是爲某個公司編寫僱員工資支付程序。

所完成的功能包括:

經理(Manager)每月按固定工資支付;

銷售人員(Salesman)在基本工資基礎上每月還有銷售提成;

一般工人(Worker)按每月工作的天數計算工資;

臨時工(Floater)按小時支付。

 

經理工資計算:月工資;

銷售人員工資計算:基本工資+每件產品提成額度*銷售的產品數量;

一般工人工資計算:每天工資*工作天數;

臨時工工資計算:每小時工資*總工作小時數。

 

在本系統中用抽象類(Employee)描述所有僱員的共同特性(如姓名,性別,出生日期,員工類別),含有計算工資的純虛函數computeSalay(),而且在系統中對於所有員工用該方法計薪是以多態形式來實現的。

系統應包含新增員工信息、刪除員工信息、員工信息搜索、員工信息統計、員工信息分類存儲、員工信息導入、按工資排序等功能爲。

 

  • 系統設計

本系統所完成的功能如下: 
1.新增員工信息;
2.刪除員工信息;
3.員工信息搜索(按姓名) ;
5.員工信息統計(按姓名或工資或類別) ;
6.員工信息分類存儲; .
7.員工信息導入;
8.按工資排序;
9.退出
 

 

 

原創手寫

本實驗本人花了很多天,許多小時,最終完成了兩個版本,其中不同點在於二進制方式存取和ASCLL(文本)方式存取兩種存取方式

 

文本存取方式版本

///文本讀取方式  string改成字符數組版
#include <iostream>///包含cin和cout
#include <cstdio>///包含scanf, printf的函數
#include <cstdlib>///包含abort()和exit()
#include <string>///string類的相關函數
#include <cstring>///包含strcmp()
#include <fstream>///文件輸入輸出流
using namespace std;
///類:
class Employee
{///職業 抽象類
protected:
    char name[10], sex[3], birthday[10], category[10];///
    double wage;
public:
    Employee(){};
    char *get_name();///
    double get_wage();
    virtual void set_data();
    virtual void show_data();
    virtual void computeSalary() = 0;
    virtual ~Employee(){};///此處很重要,一定要加virtual,具體可查“基類的虛析構函數”
    virtual void load();
    virtual void unload();
};
void Employee::set_data()
{
    cout << "請按照提示依次輸入信息" << endl;
    cout << "姓名: " << endl;
    cin >> name;
    cout << "性別: " << endl;
    cin >> sex;
    cout << "出生日期(例:19980515): " << endl;
    cin >> birthday;
    //cout << "職業類型(經理、銷售人員、工人、臨時工): " << endl;
    //cin >> category;
}
char *Employee::get_name()///
{
    return name;
}
double Employee::get_wage()
{
    return wage;
}
void Employee::show_data()
{
    cout << "姓名: " << name << endl;
    cout << "性別: " << sex << endl;
    cout << "出生日期: " << birthday << endl;
    cout << "職業類型: " << category << endl;
    cout << "總工資:" << wage << endl;
}
void Employee::load()
{///從文件中讀入數據
    cin >> name >> sex >> birthday >> category >> wage;
}
void Employee::unload()
{///將數據寫入文件
    cout << name << " " << sex << " " << birthday << " " << category << " " << wage;
}

Employee *M[100];///經理對象的指針數組
Employee *S[100];///銷售人員對象的指針數組
Employee *W[100];///工人對象的指針數組
Employee *F[100];///臨時工對象的指針數組
int n;///總人數
int m;///經理人數
int s;///銷售人員人數
int w;///工人人數
int f;///臨時工人數

class Manager: public Employee
{///經理
private:
    double monthly_wages;
public:
    Manager(){};
    void set_data();
    void show_data();
    void computeSalary();
    void load();
    void unload();
};
void Manager::set_data()
{
    Employee::set_data();
    strcpy(category, "經理"); ///category = "經理";
    cout << "請輸入該經理的月工資" << endl;
    cin >> monthly_wages;
    cout << "輸入結束" << endl;
}
void Manager::show_data()
{
    Employee::show_data();
    cout << "月工資: " << monthly_wages << endl;
}
void Manager::computeSalary()
{
    wage = monthly_wages;
}
void Manager::load()
{
    Employee::load();
    cin >> monthly_wages;
}
void Manager::unload()
{
    Employee::unload();
    cout << " " << monthly_wages << endl;
}
class Salesman: public Employee
{///銷售人員
private:
    double basic_wage, push_money;
    int sold_num;
public:
    Salesman(){};
    void set_data();
    void show_data();
    void computeSalary();
    void load();
    void unload();
};
void Salesman::set_data()
{
    Employee::set_data();
    strcpy(category, "銷售人員");///category = "銷售人員";
    cout << "基礎工資: " << endl;
    cin >> basic_wage;
    cout << "每售出一件產品的提成額度: " << endl;
    cin >> push_money;
    cout << "售出的產品數量: " << endl;
    cin >> sold_num;
    cout << "輸入結束" << endl;
}
void Salesman::show_data()
{
    Employee::show_data();
    cout << "基礎工資: " << basic_wage << endl;
    cout << "每售出一件產品的提成額度: " << push_money << endl;
    cout << "售出的產品數量: " << sold_num << endl;
}
void Salesman::computeSalary()
{
    wage = basic_wage + push_money * sold_num;
}
void Salesman::load()
{
    Employee::load();
    cin >> basic_wage >> push_money >> sold_num;
}
void Salesman::unload()
{
    Employee::unload();
    cout << " " << basic_wage << " " << push_money << " " << sold_num << endl;
}
class Worker: public Employee
{///工人
private:
    double day_wage;
    int work_day;
public:
    Worker(){};
    void set_data();
    void show_data();
    void computeSalary();
    void load();
    void unload();
};
void Worker::set_data()
{
    Employee::set_data();
    strcpy(category, "工人");///category = "工人";
    cout << "每日工資: " << endl;
    cin >> day_wage;
    cout << "工作天數: " << endl;
    cin >> work_day;
    cout << "輸入結束" << endl;
}
void Worker::show_data()
{
    Employee::show_data();
    cout << "每日工資: " << day_wage << endl;
    cout << "工作天數: " << work_day << endl;
}
void Worker::computeSalary()
{
    wage = day_wage * work_day;
}
void Worker::load()
{
    Employee::load();
    cin >> day_wage >> work_day;
}
void Worker::unload()
{
    Employee::unload();
    cout << " " << day_wage << " " << work_day << endl;
}
class Floater: public Employee
{///臨時工
private:
    double hour_wage;
    int work_hour;
public:
    Floater(){};
    void set_data();
    void show_data();
    void computeSalary();
    void load();
    void unload();
};
void Floater::set_data()
{
    Employee::set_data();
    strcpy(category, "臨時工");///category = "臨時工";
    cout << "每小時工資: " << endl;
    cin >> hour_wage;
    cout << "工作小時數: " << endl;
    cin >> work_hour;
    cout << "輸入結束" << endl;
}
void Floater::show_data()
{
    Employee::show_data();
    cout << "每小時工資: " << hour_wage << endl;
    cout << "工作小時數: " << work_hour << endl;
}
void Floater::computeSalary()
{
    wage = hour_wage * work_hour;
}
void Floater::load()
{
    Employee::load();
    cin >> hour_wage >> work_hour;
}
void Floater::unload()
{
    Employee::unload();
    cout << " " << hour_wage << " " << work_hour << endl;
}

///功能函數:

///添加員工信息:
void Add_Manager()
{///添加新經理
    M[m]= new Manager();
    M[m]->set_data();
    M[m]->computeSalary();
    m++;
    n++;
}
void Add_Salesman()
{///添加新銷售人員
    S[s]= new Salesman();
    S[s]->set_data();
    S[s]->computeSalary();
    s++;
    n++;
}
void Add_Worker()
{///添加新工人
    W[w]= new Worker();
    W[w]->set_data();
    W[w]->computeSalary();
    w++;
    n++;
}
void Add_Floater()
{///添加新臨時工
    F[f]= new Floater();
    F[f]->set_data();
    F[f]->computeSalary();
    f++;
    n++;
}
void Add_person()
{///新增員工
    int x;
    printf("您要新增的員工類型:\n");
    printf("1.經理\t 2.銷售人員\t 3.一般工人\t 4.臨時工\n");
    scanf("%d", &x);
    if(x < 1 || x > 4)
    {
        printf("輸入錯誤!\n");
        return;
    }
    switch(x)
    {
        case 1:Add_Manager();break;
        case 2:Add_Salesman();break;
        case 3:Add_Worker();break;
        case 4:Add_Floater();break;
    }
}

///刪除員工信息:
void Delete_Manager()
{///刪除經理
    int flag = 0;
    char name1[10];///
    cout << "請輸入您要刪除的員工姓名: " << endl;
    cin >> name1;
    for(int i = 0; i < m; i++)
    {
        if(strcmp(name1, M[i]->get_name()) == 0)///name1 == M[i]->get_name()
        {
            delete M[i];
            for(int j = i; j < m - 1; j++)
            {
                M[j] = M[j + 1];
            }
            M[m - 1] = NULL;
            m--;
            n--;
            flag = 1;
            break;
        }
    }
    if(flag == 0)
    {
        cout << "未找到您輸入的員工姓名" << endl;
    }
    else
    {
        cout << "刪除成功!" << endl;
    }
}
void Delete_Salesman()
{///刪除銷售人員
    int flag = 0;
    char name1[10];///
    cout << "請輸入您要刪除的員工姓名: " << endl;
    cin >> name1;
    for(int i = 0; i < s; i++)
    {
        if(strcmp(name1, S[i]->get_name()) == 0)///
        {
            delete S[i];
            for(int j = i; j < s - 1; j++)
            {
                S[j] = S[j + 1];
            }
            S[s - 1] = NULL;
            s--;
            n--;
            flag = 1;
            break;
        }
    }
    if(flag == 0)
    {
        cout << "未找到您輸入的員工姓名" << endl;
    }
    else
    {
        cout << "刪除成功!" << endl;
    }
}
void Delete_Worker()
{///刪除工人
    int flag = 0;
    char name1[10];///
    cout << "請輸入您要刪除的員工姓名: " << endl;
    cin >> name1;
    for(int i = 0; strcmp(name1, W[i]->get_name()) == 0; i++)///
    {
        if(name1 == W[i]->get_name())
        {
            delete W[i];
            for(int j = i; j < w - 1; j++)
            {
                W[j] = W[j + 1];
            }
            W[w - 1] = NULL;
            w--;
            n--;
            flag = 1;
            break;
        }
    }
    if(flag == 0)
    {
        cout << "未找到您輸入的員工姓名" << endl;
    }
    else
    {
        cout << "刪除成功!" << endl;
    }
}
void Delete_Floater()
{///刪除臨時工
    int flag = 0;
    char name1[10];///
    cout << "請輸入您要刪除的員工姓名: " << endl;
    cin >> name1;
    for(int i = 0; i < f; i++)
    {
        if(strcmp(name1, F[i]->get_name()) == 0)///
        {
            delete F[i];
            for(int j = i; j < f - 1; j++)
            {
                F[j] = F[j + 1];
            }
            F[f - 1] = NULL;
            f--;
            n--;
            flag = 1;
            break;
        }
    }
    if(flag == 0)
    {
        cout << "未找到您輸入的員工姓名" << endl;
    }
    else
    {
        cout << "刪除成功!" << endl;
    }
}
void Delete_person()
{///刪除員工
    int x;
    printf("您要刪除的員工類型:\n");
    printf("1.經理\t 2.銷售人員\t 3.一般工人\t 4.臨時工\n");
    scanf("%d", &x);
    if(x < 1 || x > 4)
    {
        printf("輸入錯誤!\n");
        return;
    }
    switch(x)
    {
        case 1:Delete_Manager();break;
        case 2:Delete_Salesman();break;
        case 3:Delete_Worker();break;
        case 4:Delete_Floater();break;
        default:printf("輸入錯誤!\n");break;
    }
}

///員工信息搜索
void Search1_inf()
{
    int flag = 0;
    char name1[10];///
    cout << "請輸入您要查找的員工姓名: " << endl;
    cin >> name1;
    for(int i = 0; i < m; i++)
    {///查詢是否爲經理
        if(strcmp(name1, M[i]->get_name()) == 0)///
        {
            M[i]->show_data();
            cout << "查詢完畢!" << endl;
            flag = 1;
            break;
        }
    }
    if(flag == 0)
    {///查詢是否爲銷售人員
        for(int i = 0; i < s; i++)
        {
            if(strcmp(name1, S[i]->get_name()) == 0)///
            {
                S[i]->show_data();
                cout << "查詢完畢!" << endl;
                flag = 1;
                break;
            }
        }
    }
    if(flag == 0)
    {///查詢是否爲工人
        for(int i = 0; i < w; i++)
        {
            if(strcmp(name1, W[i]->get_name()) == 0)///
            {
                W[i]->show_data();
                cout << "查詢完畢!" << endl;
                flag = 1;
                break;
            }
        }
    }
    if(flag == 0)
    {///查詢是否爲臨時工
        for(int i = 0; i < f; i++)
        {
            if(strcmp(name1, F[i]->get_name()) == 0)
            {
                F[i]->show_data();
                cout << "查詢完畢!" << endl;
                flag = 1;
                break;
            }
        }
    }
    if(flag == 0)
    {
        cout << "未找到您輸入的員工姓名" << endl;
    }
}

///員工信息統計
void display_all()
{
    printf("\n");
    cout << "經理信息: " << endl;
    for(int i = 0; i < m; i++)
    {
        M[i]->show_data();
        printf("\n");
    }
    cout << "經理信息統計完畢,經理人數:" << m << endl;
    printf("\n");
    cout << "銷售人員信息: " << endl;
    for(int i = 0; i < s; i++)
    {
        S[i]->show_data();
        printf("\n");
    }
    cout << "銷售人員信息統計完畢,銷售人員人數:" << s << endl;
    printf("\n");
    cout << "工人信息: " << endl;
    for(int i = 0; i < w; i++)
    {
        W[i]->show_data();
        printf("\n");
    }
    cout << "工人信息統計完畢,工人人數:" << w << endl;
    printf("\n");
    cout << "臨時工信息: " << endl;
    for(int i = 0; i < f; i++)
    {
        F[i]->show_data();
        printf("\n");
    }
    cout << "臨時工信息統計完畢,臨時工人數:" << f << endl;
    printf("\n");
    cout << "員工總人數:" << n << endl;
}

///按工資從小到大排序
template<typename T> void quick_sort(T p[], int l, int r)
{
    T key = p[l];
    int i, j;
    i = l;
    j = r;
    if(i >= j)  return;
    while(i < j)
    {
        while(i < j && p[r]->get_wage() >= key->get_wage())
            j--;
        p[i] = p[j];
        while(i < j && p[i]->get_wage() <= key->get_wage())
            i++;
        p[j] = p[i];
    }
    p[i] = key;
    quick_sort(p, i, i - 1);
    quick_sort(p, i + 1, j);
}
void sort_in_wages()
{
    int x;
    printf("您要進行排序的員工類型:\n");
    printf("1.經理\t 2.銷售人員\t 3.一般工人\t 4.臨時工\n");
    scanf("%d", &x);
    if(x < 1 || x > 4)
    {
        printf("輸入錯誤!\n");
        return;
    }
    switch(x)
    {
        case 1:quick_sort(M, 0, m - 1); break;///M和&M[0]相同,都表示首地址
        case 2:quick_sort(S, 0, s - 1);break;
        case 3:quick_sort(W, 0, w - 1);break;
        case 4:quick_sort(F, 0, f - 1);break;
        ///default:printf("輸入錯誤!\n");break;
    }
    printf("排序完成!\n");
}

///將文件中員工信息導入程序

void get_from_file()
{
    freopen("text1.txt", "r", stdin);///輸入重定向到文件
    cin >> n >> m >> s >> w >> f;
    for(int i = 0; i < m; i++)
    {
        M[i]= new Manager();
        M[i]->load();
    }
    for(int i = 0; i < s; i++)
    {
        S[i]= new Salesman();
        S[i]->load();
    }
    for(int i = 0; i < w; i++)
    {
        W[i]= new Worker();
        W[i]->load();
    }
    for(int i = 0; i < f; i++)
    {
        F[i]= new Floater();
        F[i]->load();
    }
    freopen("CON", "r", stdin);///輸入重定向到控制檯
    cout << "信息導入完畢!" << endl;
}

///將員工信息分類存儲到文件
void save_to_file()
{
    freopen("text1.txt", "w", stdout);///輸出重定向到文件
    cout << n << " " << m << " " << s << " " << w << " " << f << endl;
    for(int i = 0; i < m; i++)
    {
        M[i]->unload();
    }
    for(int i = 0; i < s; i++)
    {
        S[i]->unload();
    }
    for(int i = 0; i < w; i++)
    {
        W[i]->unload();
    }
    for(int i = 0; i < f; i++)
    {
        F[i]->unload();
    }
    freopen("CON", "w", stdout);///輸出重定向到控制檯
    cout << "信息存儲完成!" << endl;
}

void menu()
{///菜單
    printf("\n");
    printf("****************************************\n");///40個
    printf("*  1.新增員工信息                      *\n");
    printf("*  2.刪除員工信息                      *\n");
    printf("*  3.員工信息搜索                      *\n");
    printf("*  4.員工信息統計(按類別)            *\n");
    printf("*  5.按工資排序                        *\n");
    //printf("*  6.將文件中員工信息導入程序          *\n");
    //printf("*  7.將員工信息分類存儲到文件          *\n");
    printf("*  -1.退出                             *\n");
    printf("****************************************\n");
    printf("\n");
}
int main()
{
    int x;
    get_from_file();///將文件中員工信息導入程序
    cout << n << " " << m << " " << s << " " << w << " " << f << endl;
    while(1)
    {
        menu();
        printf("請輸入您要使用的功能編號: ");
        scanf("%d", &x);
        if(x == -1 || (x >= 1 && x <= 5))
        {
            switch(x)
            {
                case 1:Add_person(); break;///新增員工信息
                case 2:Delete_person(); break;///刪除員工信息
                case 3:Search1_inf(); break;///員工信息搜索
                case 4:display_all(); break;///員工信息統計
                case 5:sort_in_wages(); break;///按工資排序
                ///case 6:get_from_file(); break;///將文件中員工信息導入程序
                ///case 7:save_to_file(); break;///將員工信息分類存儲到文件
                case -1:save_to_file(); exit(1);///退出並將員工信息分類存儲到文件
                ///default:printf("輸入錯誤!請重新選擇\n"); break;
            }
        }
        else
        {
            printf("輸入錯誤!請重新選擇\n");
        }
    }
    return 0;
}

 

二進制存取方式版本     

///二進制讀取方式 string改成字符數組版
#include <iostream>///包含cin和cout
#include <cstdio>///包含scanf, printf的函數
#include <cstdlib>///包含abort()和exit()
#include <string>///string類的相關函數
#include <cstring>///包含strcmp()
#include <fstream>///文件輸入輸出流
using namespace std;
///類:
class Employee
{///職業 抽象類
protected:
    char name[10], sex[3], birthday[10], category[10];///
    double wage;
public:
    Employee(){};
    char *get_name();///
    double get_wage();
    virtual void set_data();
    virtual void show_data();
    virtual void computeSalary() = 0;
    virtual ~Employee(){};///此處很重要,一定要加virtual,具體可查“基類的虛析構函數”
};
void Employee::set_data()
{
    cout << "請按照提示依次輸入信息" << endl;
    cout << "姓名: " << endl;
    cin >> name;
    cout << "性別: " << endl;
    cin >> sex;
    cout << "出生日期(例:19980515): " << endl;
    cin >> birthday;
    //cout << "職業類型(經理、銷售人員、工人、臨時工): " << endl;
    //cin >> category;
}
char *Employee::get_name()///
{
    return name;
}
double Employee::get_wage()
{
    return wage;
}
void Employee::show_data()
{
    cout << "姓名: " << name << endl;
    cout << "性別: " << sex << endl;
    cout << "出生日期: " << birthday << endl;
    cout << "職業類型: " << category << endl;
    cout << "總工資:" << wage << endl;
}

Employee *M[100];///經理對象的指針數組
Employee *S[100];///銷售人員對象的指針數組
Employee *W[100];///工人對象的指針數組
Employee *F[100];///臨時工對象的指針數組
int n;///總人數
int m;///經理人數
int s;///銷售人員人數
int w;///工人人數
int f;///臨時工人數

class Manager: public Employee
{///經理
private:
    double monthly_wages;
public:
    Manager(){};
    void set_data();
    void show_data();
    void computeSalary();
};
void Manager::set_data()
{
    Employee::set_data();
    strcpy(category, "經理"); ///category = "經理";
    cout << "請輸入該經理的月工資" << endl;
    cin >> monthly_wages;
    cout << "輸入結束" << endl;
}
void Manager::show_data()
{
    Employee::show_data();
    cout << "月工資: " << monthly_wages << endl;
}
void Manager::computeSalary()
{
    wage = monthly_wages;
}
class Salesman: public Employee
{///銷售人員
private:
    double basic_wage, push_money;
    int sold_num;
public:
    Salesman(){};
    void set_data();
    void show_data();
    void computeSalary();
};
void Salesman::set_data()
{
    Employee::set_data();
    strcpy(category, "銷售人員");///category = "銷售人員";
    cout << "基礎工資: " << endl;
    cin >> basic_wage;
    cout << "每售出一件產品的提成額度: " << endl;
    cin >> push_money;
    cout << "售出的產品數量: " << endl;
    cin >> sold_num;
    cout << "輸入結束" << endl;
}
void Salesman::show_data()
{
    Employee::show_data();
    cout << "基礎工資: " << basic_wage << endl;
    cout << "每售出一件產品的提成額度: " << push_money << endl;
    cout << "售出的產品數量: " << sold_num << endl;
}
void Salesman::computeSalary()
{
    wage = basic_wage + push_money * sold_num;
}
class Worker: public Employee
{///工人
private:
    double day_wage;
    int work_day;
public:
    Worker(){};
    void set_data();
    void show_data();
    void computeSalary();
};
void Worker::set_data()
{
    Employee::set_data();
    strcpy(category, "工人");///category = "工人";
    cout << "每日工資: " << endl;
    cin >> day_wage;
    cout << "工作天數: " << endl;
    cin >> work_day;
    cout << "輸入結束" << endl;
}
void Worker::show_data()
{
    Employee::show_data();
    cout << "每日工資: " << day_wage << endl;
    cout << "工作天數: " << work_day << endl;
}
void Worker::computeSalary()
{
    wage = day_wage * work_day;
}
class Floater: public Employee
{///臨時工
private:
    double hour_wage;
    int work_hour;
public:
    Floater(){};
    void set_data();
    void show_data();
    void computeSalary();
};
void Floater::set_data()
{
    Employee::set_data();
    strcpy(category, "臨時工");///category = "臨時工";
    cout << "每小時工資: " << endl;
    cin >> hour_wage;
    cout << "工作小時數: " << endl;
    cin >> work_hour;
    cout << "輸入結束" << endl;
}
void Floater::show_data()
{
    Employee::show_data();
    cout << "每小時工資: " << hour_wage << endl;
    cout << "工作小時數: " << work_hour << endl;
}
void Floater::computeSalary()
{
    wage = hour_wage * work_hour;
}

///功能函數:

///添加員工信息:
void Add_Manager()
{///添加新經理
    M[m]= new Manager();
    M[m]->set_data();
    M[m]->computeSalary();
    m++;
    n++;
}
void Add_Salesman()
{///添加新銷售人員
    S[s]= new Salesman();
    S[s]->set_data();
    S[s]->computeSalary();
    s++;
    n++;
}
void Add_Worker()
{///添加新工人
    W[w]= new Worker();
    W[w]->set_data();
    W[w]->computeSalary();
    w++;
    n++;
}
void Add_Floater()
{///添加新臨時工
    F[f]= new Floater();
    F[f]->set_data();
    F[f]->computeSalary();
    f++;
    n++;
}
void Add_person()
{///新增員工
    int x;
    printf("您要新增的員工類型:\n");
    printf("1.經理\t 2.銷售人員\t 3.一般工人\t 4.臨時工\n");
    scanf("%d", &x);
    if(x < 1 || x > 4)
    {
        printf("輸入錯誤!\n");
        return;
    }
    switch(x)
    {
        case 1:Add_Manager();break;
        case 2:Add_Salesman();break;
        case 3:Add_Worker();break;
        case 4:Add_Floater();break;
    }
}

///刪除員工信息:
void Delete_Manager()
{///刪除經理
    int flag = 0;
    char name1[10];///
    cout << "請輸入您要刪除的員工姓名: " << endl;
    cin >> name1;
    for(int i = 0; i < m; i++)
    {
        if(strcmp(name1, M[i]->get_name()) == 0)///name1 == M[i]->get_name()
        {
            delete M[i];
            for(int j = i; j < m - 1; j++)
            {
                M[j] = M[j + 1];
            }
            M[m - 1] = NULL;
            m--;
            n--;
            flag = 1;
            break;
        }
    }
    if(flag == 0)
    {
        cout << "未找到您輸入的員工姓名" << endl;
    }
    else
    {
        cout << "刪除成功!" << endl;
    }
}
void Delete_Salesman()
{///刪除銷售人員
    int flag = 0;
    char name1[10];///
    cout << "請輸入您要刪除的員工姓名: " << endl;
    cin >> name1;
    for(int i = 0; i < s; i++)
    {
        if(strcmp(name1, S[i]->get_name()) == 0)///
        {
            delete S[i];
            for(int j = i; j < s - 1; j++)
            {
                S[j] = S[j + 1];
            }
            S[s - 1] = NULL;
            s--;
            n--;
            flag = 1;
            break;
        }
    }
    if(flag == 0)
    {
        cout << "未找到您輸入的員工姓名" << endl;
    }
    else
    {
        cout << "刪除成功!" << endl;
    }
}
void Delete_Worker()
{///刪除工人
    int flag = 0;
    char name1[10];///
    cout << "請輸入您要刪除的員工姓名: " << endl;
    cin >> name1;
    for(int i = 0; strcmp(name1, W[i]->get_name()) == 0; i++)///
    {
        if(name1 == W[i]->get_name())
        {
            delete W[i];
            for(int j = i; j < w - 1; j++)
            {
                W[j] = W[j + 1];
            }
            W[w - 1] = NULL;
            w--;
            n--;
            flag = 1;
            break;
        }
    }
    if(flag == 0)
    {
        cout << "未找到您輸入的員工姓名" << endl;
    }
    else
    {
        cout << "刪除成功!" << endl;
    }
}
void Delete_Floater()
{///刪除臨時工
    int flag = 0;
    char name1[10];///
    cout << "請輸入您要刪除的員工姓名: " << endl;
    cin >> name1;
    for(int i = 0; i < f; i++)
    {
        if(strcmp(name1, F[i]->get_name()) == 0)///
        {
            delete F[i];
            for(int j = i; j < f - 1; j++)
            {
                F[j] = F[j + 1];
            }
            F[f - 1] = NULL;
            f--;
            n--;
            flag = 1;
            break;
        }
    }
    if(flag == 0)
    {
        cout << "未找到您輸入的員工姓名" << endl;
    }
    else
    {
        cout << "刪除成功!" << endl;
    }
}
void Delete_person()
{///刪除員工
    int x;
    printf("您要刪除的員工類型:\n");
    printf("1.經理\t 2.銷售人員\t 3.一般工人\t 4.臨時工\n");
    scanf("%d", &x);
    if(x < 1 || x > 4)
    {
        printf("輸入錯誤!\n");
        return;
    }
    switch(x)
    {
        case 1:Delete_Manager();break;
        case 2:Delete_Salesman();break;
        case 3:Delete_Worker();break;
        case 4:Delete_Floater();break;
        default:printf("輸入錯誤!\n");break;
    }
}

///員工信息搜索
void Search1_inf()
{
    int flag = 0;
    char name1[10];///
    cout << "請輸入您要查找的員工姓名: " << endl;
    cin >> name1;
    for(int i = 0; i < m; i++)
    {///查詢是否爲經理
        if(strcmp(name1, M[i]->get_name()) == 0)///
        {
            M[i]->show_data();
            cout << "查詢完畢!" << endl;
            flag = 1;
            break;
        }
    }
    if(flag == 0)
    {///查詢是否爲銷售人員
        for(int i = 0; i < s; i++)
        {
            if(strcmp(name1, S[i]->get_name()) == 0)///
            {
                S[i]->show_data();
                cout << "查詢完畢!" << endl;
                flag = 1;
                break;
            }
        }
    }
    if(flag == 0)
    {///查詢是否爲工人
        for(int i = 0; i < w; i++)
        {
            if(strcmp(name1, W[i]->get_name()) == 0)///
            {
                W[i]->show_data();
                cout << "查詢完畢!" << endl;
                flag = 1;
                break;
            }
        }
    }
    if(flag == 0)
    {///查詢是否爲臨時工
        for(int i = 0; i < f; i++)
        {
            if(strcmp(name1, F[i]->get_name()) == 0)
            {
                F[i]->show_data();
                cout << "查詢完畢!" << endl;
                flag = 1;
                break;
            }
        }
    }
    if(flag == 0)
    {
        cout << "未找到您輸入的員工姓名" << endl;
    }
}

///員工信息統計
void display_all()
{
    printf("\n");
    cout << "經理信息: " << endl;
    for(int i = 0; i < m; i++)
    {
        M[i]->show_data();
        printf("\n");
    }
    cout << "經理信息統計完畢,經理人數:" << m << endl;
    printf("\n");
    cout << "銷售人員信息: " << endl;
    for(int i = 0; i < s; i++)
    {
        S[i]->show_data();
        printf("\n");
    }
    cout << "銷售人員信息統計完畢,銷售人員人數:" << s << endl;
    printf("\n");
    cout << "工人信息: " << endl;
    for(int i = 0; i < w; i++)
    {
        W[i]->show_data();
        printf("\n");
    }
    cout << "工人信息統計完畢,工人人數:" << w << endl;
    printf("\n");
    cout << "臨時工信息: " << endl;
    for(int i = 0; i < f; i++)
    {
        F[i]->show_data();
        printf("\n");
    }
    cout << "臨時工信息統計完畢,臨時工人數:" << f << endl;
    printf("\n");
    cout << "員工總人數:" << n << endl;
}

///按工資排序
template<typename T> void quick_sort(T p[], int l, int r)
{
    T key = p[l];
    int i, j;
    i = l;
    j = r;
    if(i >= j)  return;
    while(i < j)
    {
        while(i < j && p[r]->get_wage() >= key->get_wage())
            j--;
        p[i] = p[j];
        while(i < j && p[i]->get_wage() <= key->get_wage())
            i++;
        p[j] = p[i];
    }
    p[i] = key;
    quick_sort(p, i, i - 1);
    quick_sort(p, i + 1, j);
}
void sort_in_wages()
{
    int x;
    printf("您要進行排序的員工類型:\n");
    printf("1.經理\t 2.銷售人員\t 3.一般工人\t 4.臨時工\n");
    scanf("%d", &x);
    if(x < 1 || x > 4)
    {
        printf("輸入錯誤!\n");
        return;
    }
    switch(x)
    {
        case 1:quick_sort(M, 0, m - 1); break;///M和&M[0]相同,都表示首地址
        case 2:quick_sort(S, 0, s - 1);break;
        case 3:quick_sort(W, 0, w - 1);break;
        case 4:quick_sort(F, 0, f - 1);break;
        ///default:printf("輸入錯誤!\n");break;
    }
    printf("排序完成!\n");
}

///將文件中員工信息導入程序
void get_from_file()
{
    ifstream infile("file1.dat", ios::in | ios::binary);///|ios::binary
    if(!infile)
    {
        cerr << "open file1.dat error!" << endl;
        cerr << "請將數據文件\"file1.dat\"放入該程序所在文件夾,或在該程序所在文件夾中建立該文件!" << endl;
        abort();
    }
    infile.read((char *)&n, sizeof(n));
    infile.read((char *)&m, sizeof(m));
    infile.read((char *)&s, sizeof(s));
    infile.read((char *)&w, sizeof(w));
    infile.read((char *)&f, sizeof(f));
    for(int i = 0; i < m; i++)
    {
        M[i]= new Manager();
        infile.read((char *)M[i], sizeof(Manager));
    }
    for(int i = 0; i < s; i++)
    {
        S[i]= new Salesman();
        infile.read((char *)S[i], sizeof(Salesman));
    }
    for(int i = 0; i < w; i++)
    {
        W[i]= new Worker();
        infile.read((char *)W[i], sizeof(Worker));
    }
    for(int i = 0; i < f; i++)
    {
        F[i]= new Floater();
        infile.read((char *)F[i], sizeof(Floater));
    }
    infile.close();
    cout << "信息導入完畢!" << endl;
}

///將員工信息分類存儲到文件
void save_to_file()
{
    ofstream outfile("file1.dat", ios::out | ios::binary);
    if(!outfile)
    {
        cerr << "open file1.dat error!" << endl;
        abort();
    }
    outfile.write((char *)&n, sizeof(n));
    outfile.write((char *)&m, sizeof(m));
    outfile.write((char *)&s, sizeof(s));
    outfile.write((char *)&w, sizeof(w));
    outfile.write((char *)&f, sizeof(f));
    for(int i = 0; i < m; i++)
    {
        outfile.write((char *)M[i], sizeof(Manager));
    }
    for(int i = 0; i < s; i++)
    {
        outfile.write((char *)S[i], sizeof(Salesman));
    }
    for(int i = 0; i < w; i++)
    {
        outfile.write((char *)W[i], sizeof(Worker));
    }
    for(int i = 0; i < f; i++)
    {
        outfile.write((char *)F[i], sizeof(Floater));
    }
    outfile.close();
    cout << "信息存儲完成!" << endl;
}

void menu()
{///菜單
    printf("\n");
    printf("****************************************\n");///40個
    printf("*  1.新增員工信息                      *\n");
    printf("*  2.刪除員工信息                      *\n");
    printf("*  3.員工信息搜索                      *\n");
    printf("*  4.員工信息統計(按類別)            *\n");
    printf("*  5.按工資排序                        *\n");
    //printf("*  6.將文件中員工信息導入程序          *\n");
    //printf("*  7.將員工信息分類存儲到文件          *\n");
    printf("*  -1.退出                             *\n");
    printf("****************************************\n");
    printf("\n");
}
int main()
{
    int x;
    get_from_file();///將文件中員工信息導入程序
    cout << n << " " << m << " " << s << " " << w << " " << f << endl;
    while(1)
    {
        menu();
        printf("請輸入您要使用的功能編號: ");
        scanf("%d", &x);
        if(x == -1 || (x >= 1 && x <= 5))
        {
            switch(x)
            {
                case 1:Add_person(); break;///新增員工信息
                case 2:Delete_person(); break;///刪除員工信息
                case 3:Search1_inf(); break;///員工信息搜索
                case 4:display_all(); break;///員工信息統計
                case 5:sort_in_wages(); break;///按工資排序
                ///case 6:get_from_file(); break;///將文件中員工信息導入程序
                ///case 7:save_to_file(); break;///將員工信息分類存儲到文件
                case -1:save_to_file(); exit(1);///退出並將員工信息分類存儲到文件
                ///default:printf("輸入錯誤!請重新選擇\n"); break;
            }
        }
        else
        {
            printf("輸入錯誤!請重新選擇\n");
        }
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章