-
課程設計內容
-
課題描述
本系統是爲某個公司編寫僱員工資支付程序。
所完成的功能包括:
經理(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;
}