1. 程式人生 > >《面向物件程式設計》課程設計報告

《面向物件程式設計》課程設計報告

題目:小型公司工資管理系統

功能:

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();
}