《面向物件程式設計》課程設計報告
題目:小型公司工資管理系統
功能:
1、公司各部門員工資訊分類錄入;
2、公司銷售部工資情況查詢;(分類各銷售經理下屬銷售員情況)
3、公司總體工資情況查詢;
要求:
實現一個工資管理系統,系統的主要功能是計算職工當月工資並要求存檔案。
公司是一個不大不小公司,職工有種5型別,他們是技術人員,銷售人員,文祕,技術經理,銷售經理。世界從來就不是公平的,在公司內部也一樣,不同職位工資不同。
技術人員工資是按小時算,薪酬為40元。銷售人員工資是按銷售提成,月工資為銷售總額的5%。文祕為有4000元底薪,獎金要看當月的工作情況而定。技術經理和銷售經理,均有每月5000元固定工資。技術經理工作業績分為三個等級,每級有1000元獎金,銷售經理資金由他管理團隊銷售業績而定,為總經額的0.3%。
分析:
技術人員 工作小時*時薪40元
銷售人員 銷售總額的5%
文祕 4000底薪+獎金
技術經理 5000底薪+獎金(1000-3000)
銷售經理 5000底薪+總經額0.3%
先定義一個僱員類Employee,由僱員類公有派生出技術員類Tech,銷售員類Seller,文祕類Secretary和技術經理類YManager,再由銷售員類Seller公有派生出銷售經理類XManager。把基類都定義為虛基類。通過基類去寫的派生類就可以調基類的公有成員。利用for迴圈把文祕資料,技術員資料,銷售員資料,技術經理資料和銷售經理資料輸入,利用switch進行選擇系統進行的工作。在主選單中進行呼叫各函式,從而實現系統各功能的執行。
不足:
這個程式有挺多不足的地方啊。。。
首先是題目要求——文祕和技術經理的工資是由底薪還有獎金組成的,但由於我不知道怎麼理解這個獎金,所以程式裡沒有實現這個功能。
員工資訊的錄入方面,沒有刪除錯誤錄入資訊的功能,萬一錄入資訊錯誤必須重新錄入此類全部員工的資訊。並且程式很硬性地規定要錄入4名文祕、4名技術員、8名銷售員、4名技術經理、4名銷售經理的資訊,其中每名銷售經理旗下有2名銷售員。最後展示情況的表格也是根據這個數量設定的。
還有一個我一開始沒有發現的漏洞,一開始設定了銷售員有“所屬銷售經理編號”的輸入,本來想根據這個編號歸類銷售員的,但由於後來不知道怎麼實現,所以沒去管它。結果導致銷售員的歸類與所輸入的“所屬銷售經理編號”無關,第1、2個輸入的銷售員資訊預設歸類到第1個輸入的銷售經理旗下,以此類推。
程式碼:
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
class Employee//僱員類
{
protected:
int number;
int age;
char name[10];
double income;
char sex;
public:
virtual void Set()
{
cout<<"姓名:";
cin>>name;
cout<<"性別(m/w):";
cin>>sex;
cout<<"年齡:";
cin>>age;
}
void Get()
{
cout<<"┣━━━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━┫"<<endl;
cout<<"┃"<<setw(10)<<number<<"┃";
int n=10-strlen(name);
for(int i=0;i<n;i++)
cout<<" ";
cout<<name<<"┃"<<" "<<sex<<" "<<"┃"<<setw(10)<<age<<"┃"<<setw(10)<<income<<"┃"<<endl;
}
};
//*****************************************************
class Tech:virtual public Employee//技術員類
{
protected:
double hour;
double per;
public:
void Set()
{
cout<<endl;
cout<<"技術員編號:";
cin>>number;
Employee::Set();
cout<<"工作時間:";
cin>>hour;
per=40;
income=hour*per;
}
};
//*****************************************************
class Seller: virtual public Employee//銷售員類
{
protected:
double salary;//銷售額
int ss;//所屬銷售經理編號
public:
double Gets()
{ return salary;}
void Set()
{
cout<<endl;
cout<<"銷售員編號:";
cin>>number;
Employee::Set();
cout<<"銷售額:";
cin>>salary;
cout<<"所屬銷售經理編號:";
cin>>ss;
income=salary*0.05;
}
void Get1()
{
int n=10-strlen(name);
cout<<"┃"<<setw(12)<<number<<"┃";
for(int i=0;i<n;i++) cout<<" ";
cout<<name<<"┃"<<setw(12)<<salary<<"┃"<<endl;
}
};
//*****************************************************
class Secretary:virtual public Employee//文祕類
{
protected:
public:
void Set()
{
cout<<endl;
cout<<"文祕的編號:";
cin>>number;
Employee::Set();
income=4000;
}
};
//*****************************************************
class Ymanager:virtual public Employee//技術經理類
{
protected:
public:
void Set()
{
cout<<endl;
cout<<"技術經理的編號:";
cin>>number;
Employee::Set();
income=5000;
}
};
//*****************************************************
class Xmanager:virtual public Seller//銷售經理類
{
protected:
Seller c1;//銷售員
Seller c2;//銷售員
double totals;//銷售總額
public:
double returnt()
{return totals;}
void Setc()
{
c1.Set();
cout<<endl;
c2.Set();
cout<<endl;
}
void Set()
{
cout<<endl;
cout<<"銷售經理編號:";
cin>>number;
Employee::Set();
totals=c1.Gets()+c2.Gets();
income=5000+totals*0.003;
}
void Getx()
{
cout<<"┣━━━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━┫"<<endl;
cout<<"┃"<<setw(10)<<number<<"┃";
int n=10-strlen(name);
for(int i=0;i<n;i++)
cout<<" ";
cout<<name<<"┃"<<" "<<sex<<" "<<"┃"<<setw(10)<<age<<"┃"<<setw(10)<<income<<"┃"<<endl;
}
void Get1()
{
cout<<"職工編號"<<number<<"銷售經理"<<name<<"下屬銷售員的業績為:"<<endl;
cout<<"┏━━━━━━┳━━━━━┳━━━━━━┓"<<endl;
cout<<"┃"<<" 職工號 "<<"┃"<<" 姓名 "<<"┃"<<" 銷售額 "<<"┃"<<endl;
cout<<"┣━━━━━━╋━━━━━╋━━━━━━┫"<<endl;
c1.Get1();
cout<<"┣━━━━━━╋━━━━━╋━━━━━━┫"<<endl;
c2.Get1();
cout<<"┣━━━━━━╋━━━━━┻━━━━━━┫"<<endl;
cout<<"┃"<<"銷售額總計:"<<"┃"<<setw(23)<<totals<<" ┃"<<endl;
cout<<"┗━━━━━━┻━━━━━━━━━━━━┛"<<endl;
}
void Getc()
{
c1.Get();
c2.Get();
}
};
//*****************************************************
void beginning()//輸出表格頭部
{
cout<<"┏━━━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━┓"<<endl;
cout<<"┃"<<" 職工號 "<<"┃"<<" 姓名 "<<"┃"<<" 性別 "<<"┃"<<" 年齡 "<<"┃"<<" 工資 "<<"┃"<<endl;
}
void end()//輸出表格尾部
{
cout<<"┗━━━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━┛"<<endl;
}
//*****************************************************
Secretary A[4]; //定義全域性物件
Tech B[4];
Ymanager D[4];
Xmanager E[4];
int i; //變數
int InputSecretary()
{
for(i=0;i<4;i++)
{A[i].Set();cout<<endl;}
cout<<"-------------------------------------------"<<endl;
return 0;
}
int InputTech ()
{
for(i=0;i<4;i++)
{B[i].Set();cout<<endl;}
cout<<"-------------------------------------------"<<endl;
return 0;
}
int InputYManager()
{
for(i=0;i<4;i++)
{D[i].Set();cout<<endl;}
cout<<"-------------------------------------------"<<endl;
return 0;
}
int InputSeller()
{
for(i=0;i<4;i++)
{E[i].Setc();cout<<endl;}
cout<<"-------------------------------------------"<<endl;
return 0;
}
int InputXManager()
{
for(i=0;i<4;i++)
{E[i].Set();cout<<endl;}
cout<<"-------------------------------------------"<<endl;
return 0;
}
//*****************************************************
int Sort()//氣泡排序法
{
for(int pass=1;pass<4;pass++)
{
for(i=0;i<4-pass;i++)
if(E[i].returnt()<E[i+1].returnt())
{
Xmanager temp;
temp=E[i];
E[i]=E[i+1];
E[i+1]=temp;
}
}
return 0;
}
//*****************************************************
int IntputMenu()
{
cout<<endl<<endl;
cout<<" *******小型公司工資管理系統*******"<<endl;
cout<<" ┏━━━━━━━━━━━━━━━━┓"<<endl;
cout<<" ┃ 請選擇您所需要的操作 ┃"<<endl;
cout<<" ┃ 文祕資料輸入 : 1,並按回車鍵 ┃"<<endl;
cout<<" ┃ 技術員資料輸入 : 2,並按回車鍵 ┃"<<endl;
cout<<" ┃ 銷售員資料輸入 : 3,並按回車鍵 ┃"<<endl;
cout<<" ┃ 技術經理資料輸入: 4,並按回車鍵 ┃"<<endl;
cout<<" ┃ 銷售經理資料輸入: 5,並按回車鍵 ┃"<<endl;
cout<<" ┃ 返回上一層 : 6,並按回車 ┃"<<endl;
cout<<" ┗━━━━━━━━━━━━━━━━┛"<<endl;
cout<<endl;
cout<<"請選擇一個操作: ";
cin>>i;
switch(i)
{
case 1:InputSecretary();
break;
case 2:InputTech ();
break;
case 3:InputSeller();
break;
case 4:InputYManager();
break;
case 5:InputXManager();
break;
case 6: Sort();
return 0;
break;
}
return 1;
}
//*****************************************************
int StatisticMenu()//資料統計
{
for(i=0;i<4;i++)
{
E[i].Get1();
cout<<endl;
}
cout<<endl;
cout<<"銷售經理按工資排序為:"<<endl;
beginning ();
for(i=0;i<4;i++)
E[i].Getx();
end();
return 0;
}
int PrintMenu()
{
cout<<"請等待..............."<<endl;
cout<<"職工基本情況一覽表如下:"<<endl;
cout<<"技術員"<<endl;
beginning ();
for(i=0;i<4;i++)
B[i].Get();
end ();
cout<<"--------------------------------------------------------------"<<endl;
cout<<"文祕"<<endl;
beginning ();
for(i=0;i<4;i++)
A[i].Get();
end ();
cout<<"--------------------------------------------------------------"<<endl;
cout<<"技術經理"<<endl;
beginning ();
for(i=0;i<4;i++)
D[i].Get();
end ();
cout<<"--------------------------------------------------------------"<<endl;
cout<<"銷售經理"<<endl;
beginning ();
for(i=0;i<4;i++)
E[i].Get();
end ();
cout<<"------------------------------------------------------------"<<endl;
cout<<"銷售員"<<endl;
beginning ();
for(i=0;i<4;i++)
E[i].Getc();
end ();
cout<<"------------------------------------------------------------------"<<endl;
return 0;
}
//*****************************************************
int Showmenu()
{
while(1)
{
cout<<endl;
cout<<" ***小型公司工資管理系統***"<<endl;
cout<<" ┏━━━━━━━━━━━━┓"<<endl;
cout<<" ┃ 請選擇您所需要的操作 ┃"<<endl;
cout<<" ┃ 資料錄入: 1,並按回車鍵 ┃"<<endl;
cout<<" ┃ 銷售情況: 2,並按回車鍵 ┃"<<endl;
cout<<" ┃ 總體情況: 3,並按回車鍵 ┃"<<endl;
cout<<" ┃ 退出系統: 4,並按回車鍵 ┃"<<endl;
cout<<" ┗━━━━━━━━━━━━┛"<<endl;
cout<<endl;
cout<<"請選擇一個操作: ";
cin>>i;
switch(i)
{
case 1:IntputMenu();
break;
case 2:StatisticMenu();
break;
case 3:PrintMenu();
break;
case 4:return 0;
break;
}
}
}
void main()
{
Showmenu();
}