C++大作業(面向對象程序設計大作業)——銷售公司員工管理

 

面向對象程序設計大作業

 

目錄

 

面向對象程序設計大作業

1.問題重述

2.編程思想

2.1數據結構

2.2功能確定

3.類的設計

3.1UML圖標準

3.2本題類圖

4.運行結果

1.輸出所有信息

2.查詢總人數

3.添加數據

4.更新數據

5.查詢數據

6.刪除數據

7.重組數據

5.問題及解決

6.源代碼


 

 

 

 

1.問題重述

銷售公司員工管理

設計一個虛基類Staff(員工),包含編號、姓名和年齡保護數據成員以及相關的成員函數;由Staff派生出銷售員類Salesman,包含銷售額保護數據成員以及相關的成員函數;再由Staff派生出經理類Manager;然後由Salesman和Manager類派生出銷售經理類SalesManager。

設計一個利用文件處理方式實現對公司人員(包括銷售員、經理和銷售經理)進行管理,具有增加數據、更新數據、查詢數據、刪除數據以及重組文件的功能。(刪除數據在記錄中做刪除標誌,重組文件指在物理上刪除有刪除標誌的記錄。)另外要求分別統計這三類員工的人數以及所有員工的總數。

 

2.編程思想

2.1數據結構

一開始我想採用對象數組來實現,但是其中的問題在於插入刪除的時候效率不高,需要對數據進行大量的移動修改。於是我採用了鏈表的數據結構,即所有的員工對象構成一個鏈表,通過頭指針和尾指針進行相關操作,對於進行大量插入刪除重組操作而言效率較高,且代碼易於維護。

 

2.2功能確定

對於題中所述的四個類(員工類、銷售員類、經理類、銷售經理類)以及相應成員(編號、姓名、年齡、銷售額),都進行了實現,並進行了成員擴充:經理類添加成員變量dept即部門,基類員工類添加了成員變量status表示在職狀態,若在職狀態爲離職則在重組文件時刪除對應記錄。每個類添加了set函數以實現初始化、show函數實現輸出、get函數輸出成員變量的值、ReadFormFile從文件讀入一條數據。

上述四個類(員工類、銷售員類、經理類、銷售經理類)實現了對單條記錄的操作,我爲了實現文件管理,定義了對相應四個對象鏈表進行文件操作的類(Staff_file,Salesman_file,Manager_file,SalesManager_file),具體實現了7個功能:

 

   1.輸出所有信息

  2.查詢總人數

3.添加數據

4.更新數據

5.查詢數據

6.刪除數據

7.重組數據

來實現對文件的管理。

 

3.類的設計

3.1UML圖標準

UML圖也即類圖,UML(Unified Model Language) 即統一建模語言,畫類圖是有一定標準的,具體如下:

虛線箭頭指向依賴;

實線箭頭指向關聯;

虛線三角指向接口;

實線三角指向基類;

空心菱形能分離而獨立存在,是聚合;

實心菱形精密關聯不可分,是組合;

由於UML圖能夠清晰的表達出類的設計,畫類圖時應按上述標準作圖。

3.2本題類圖

 

我一共設計了八個類,其UML圖如下:

(由於作圖工具畫不出實線三角,只能使用實心箭頭代替)下面兩張類圖畫下面兩個箭頭的時候畫反了。。。

 

 

 

 

圖1:員工類、銷售員類、經理類、銷售經理類的類圖

 

其中圖成員變量num爲編號,name爲名字,age爲年齡,status爲在職狀態,get方法爲獲得相應成員變量值的函數,show方法輸出該條數據信息(一個對象代表文件中一條數據),remove方法即添加刪除標記,將status置爲離職,ReadFromFile方法從文件流中讀入一條數據初始化當前對象。

 

 

實現文件操作類的類圖如下:

 

圖2:文件操作類的類圖

 

其中Head爲指向對象鏈表的頭指針,End是鏈表尾指針,in爲文件輸入流對象,out爲文件輸出流對象,構造函數從文件讀入數據初始化對象鏈表,析構函數刪除鏈表和頭尾指針,findItem方法以員工編號查找相應對象,返回對象指針,save方法用out文件輸出流對象將變動更新至相應文件,add方法實現添加信息功能,find方法實現查詢功能,alter方法實現修改功能 ,del方法實現刪除功能,rebuild方法實現文件重組功能,findsum方法實現查詢人員總數功能,display方法實現輸出所有信息功能。

 

4.運行結果

文本文件位於工作環境中

 

 

以銷售員爲例

查詢之前銷售員文件內容

 

 

 

 

分別執行七個功能

1.輸出所有信息

 

2.查詢總人數

3.添加數據

 

文件內容爲

 

成功向文件添加信息

4.更新數據

 

文件內容爲

 

更新文件內容成功

 

 

 

5.查詢數據

 

6.刪除數據

 

文件中的內容爲

 

7.重組數據

 

文件內容爲

 

 

5.問題及解決

程序第一次編譯時報了不少語法錯誤,經過細心的修改之後算是可以正常運行了(語法錯誤就不細講了,查看ppt以及網上查找資料就可以解決),但是在測試功能7即重組數據的時候出現了問題,無法重組文件。

修改前相關代碼如下:

 

void rebuild() //5.重組文件,該含標記的銷售員從文件中刪除

{

char num[20];

Salesman *p=NULL,*temp=NULL;

cout<<"正在重組文件..."<<endl;

for(p=Head->Next;p!=End;p=p->Next,q=q->Next)

{

//cout<<"正在重組文件"<<endl;

//cout<<strcmp(p->get_status(),"離職")<<endl;

if(strcmp(p->get_status(),"離職")==0)

{

temp=p->Next;

p->Next=p->Next->Next;

delete temp;

}

}

 

save();

cout<<"重組完畢!"<<endl;

}

 

經過調試後,我發現問題在於代碼段

 

if(strcmp(p->get_status(),"離職")==0)

{

temp=p->Next;

p->Next=p->Next->Next;

delete temp;

}

 

如果p指向的是最後一條數據,則p->Next->Next語句發生了越界,但是編譯運行的時候並沒有保錯,於是解決方法爲重組文件時對每條信息分類討論,如果是最後一條數據,則採用其前一個指針q即可。

修改後代碼如下

 

void rebuild() //5.重組文件,該含標記的銷售員從文件中刪除

{

char num[20];

Salesman *p=NULL,*temp=NULL;

Salesman *q=Head; //q是p的front 

cout<<"正在重組文件..."<<endl;

for(p=Head->Next;p!=End;p=p->Next,q=q->Next)

{

//cout<<"正在重組文件"<<endl;

//cout<<strcmp(p->get_status(),"離職")<<endl;

if(strcmp(p->get_status(),"離職")==0)

{

if(p->Next!=End) //若待刪除的是最後一項數據,則使用q指針 

{

temp=p->Next;

p->Next=p->Next->Next;

delete temp;

}

else{

temp=q->Next;

q->Next=q->Next->Next;

delete temp;

}

}

}

 

save();

cout<<"重組完畢!"<<endl;

}

此時可以正常運行

 

6.源代碼


#include<iostream>

#include<fstream>

#include<string.h>



using namespace std;



class Staff

{

protected:

	char num[20];

	char name[20];

	int age;

	char status[10]; //在職信息,若刪除該信息,員工狀態置爲離職,重組文件時刪除

	//取值爲:“在職”或“離職”



public:

	Staff *Next; //所有的員工構成一個鏈表

	void set_Staff() //設置員工信息

	{

		cout << "請輸入員工編號:" << endl;

		cin >> num;

		cout << "請輸入員工名字:" << endl;

		cin >> name;

		cout << "請輸入員工年齡:" << endl;

		cin >> age;

		cout << "請輸入員工的在職狀態:" << endl;

		cin >> status;

	}



	void ReadFormFile(istream &in)

	{

		in >> num >> name >> age >> status; //從文件讀入一個員工的信息



	}



	void show()

	{

		cout << "該員工的編號爲:" << num << endl;

		cout << "該員工的名字爲:" << name << endl;

		cout << "該員工的年齡爲:" << age << endl;

		cout << "該員工的在職狀態爲:" << status << endl;

		//輸出員工信息



	}



	void remove() //刪除員工,添加標記

	{

		strcpy(status, "離職");



	}



	char *get_num()

	{

		return num;

	}



	char *get_name()

	{



		return name;

	}



	int get_age()

	{

		return age;

	}



	char *get_status()

	{



		return status;

	}

};





class Salesman :virtual public Staff

{

protected:

	int sales;



public:

	Salesman *Next;

	void set_Salesman()

	{

		cout << "請輸入銷售員編號:" << endl;

		cin >> num;

		cout << "請輸入銷售員名字:" << endl;

		cin >> name;

		cout << "請輸入銷售員年齡:" << endl;

		cin >> age;

		cout << "請輸入銷售員的在職狀態:" << endl;

		cin >> status;

		cout << "請輸入銷售員銷售額:" << endl;

		cin >> sales;

	}



	void ReadFormFile(istream &in)

	{

		in >> num >> name >> age >> status >> sales; //從文件讀入一個員工的信息



	}



	void show()

	{

		cout << "該銷售員的編號爲:" << num << endl;

		cout << "該銷售員的名字爲:" << name << endl;

		cout << "該銷售員的年齡爲:" << age << endl;

		cout << "該銷售員的在職狀態爲:" << status << endl;

		cout << "該銷售員的銷售額爲:" << sales << endl;

		//輸出員工信息



	}



	int get_sales()

	{



		return sales;

	}







};



class Manager :virtual public Staff

{

protected:

	char dept[10];   //經理所屬部門



public:

	Manager *Next;

	void set_Manager()

	{

		cout << "請輸入經理編號:" << endl;

		cin >> num;

		cout << "請輸入經理名字:" << endl;

		cin >> name;

		cout << "請輸入經理年齡:" << endl;

		cin >> age;

		cout << "請輸入經理的在職狀態:" << endl;

		cin >> status;

		cout << "請輸入經理所在部門:" << endl;

		cin >> dept;



	}



	void ReadFormFile(istream &in)

	{

		in >> num >> name >> age >> status >> dept; //從文件讀入一個員工的信息



	}



	void show()

	{

		cout << "該經理的編號爲:" << num << endl;

		cout << "該經理的名字爲:" << name << endl;

		cout << "該經理的年齡爲:" << age << endl;

		cout << "該經理的在職狀態爲:" << status << endl;

		cout << "該經理所在部門爲:" << dept << endl;





	}



	char *get_dept()

	{

		return dept;

	}





};



class SalesManager :public Salesman, public Manager

{

public:

	SalesManager *Next;

	void set_SalesManager()

	{

		cout << "請輸入銷售經理編號:" << endl;

		cin >> num;

		cout << "請輸入銷售經理名字:" << endl;

		cin >> name;

		cout << "請輸入銷售經理年齡:" << endl;

		cin >> age;

		cout << "請輸入銷售經理的在職狀態:" << endl;

		cin >> status;

		cout << "請輸入銷售經理的銷售額:" << endl;

		cin >> sales;

		cout << "請輸入銷售經理所在部門:" << endl;

		cin >> dept;

	}



	void ReadFormFile(istream &in)

	{

		in >> num >> name >> age >> status >> sales >> dept; //從文件讀入一個員工的信息



	}





	void show()

	{

		cout << "該銷售經理的編號爲:" << num << endl;

		cout << "該銷售經理的名字爲:" << name << endl;

		cout << "該銷售經理的年齡爲:" << age << endl;

		cout << "該銷售經理的在職狀態爲:" << status << endl;

		cout << "該銷售經理的銷售額爲:" << sales << endl;

		cout << "該銷售經理所在部門爲:" << dept << endl;





	}





};



class Staff_file

{

protected:

	Staff *Head, *End;

	ifstream in;

	ofstream out;



	Staff *findItem(char *num)

	{

		for (Staff *p = Head; p->Next != End; p = p->Next)

		{

			if (strcmp(p->Next->get_num(), num) == 0)

				return p;



		}



		return NULL;

	}







public:

	Staff_file()

	{

		Head = new Staff; //鏈表頭指針,不存儲數據

		Head->Next = new Staff;

		End = Head->Next; //鏈表尾指針

		in.open("Staff.txt");



		while (in.eof() != true) //從文件讀入到員工對象鏈表中

		{

			End->ReadFormFile(in);

			if (End->get_num()[0] == '\0')

				break;

			End->Next = new Staff;

			End = End->Next;

		}

		in.close();

	}



	~Staff_file()

	{

		for (Staff *temp; Head->Next != End;)

		{

			temp = Head->Next;

			Head->Next = Head->Next->Next;

			delete temp;

		}

		delete Head, End;

	}



	void save() //將對象鏈表存入文件

	{

		out.open("Staff.txt"); //默認輸出方式,若文件存在則刪除文件

		for (Staff *p = Head->Next; p != End; p = p->Next)

		{

			out << p->get_num() << " " << p->get_name() << " " << p->get_age()

				<< " " << p->get_status() << endl;

		}

		out.close();

	}



	void add() //1.增加員工信息

	{

		End->set_Staff();

		End->Next = new Staff;

		End = End->Next;

		save();

	}



	void find() //2.查詢員工信息功能

	{

		char num[20];

		Staff *p = NULL;

		cout << "請輸入需要查詢的員工編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該員工的前驅

			p->Next->show(); //輸出員工信息

		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}







	void alter() //3.修改員工信息功能

	{

		char num[20];

		Staff *p = NULL;

		cout << "請輸入要修改的員工編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該員工的前驅

		{

			p->Next->show(); //輸出員工信息

			cout << "請輸入新的信息" << endl;

			p->Next->set_Staff();



		}



		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}



	void del() //4.刪除員工,即添加標記

	{

		char num[20];

		Staff *p = NULL;

		cout << "請輸入要刪除的員工編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該員工的前驅

		{



			cout << "已刪除該員工,將其在職信息改爲“離職”,若要刪除該員工信息,請重組文件" << endl;

			p->Next->remove();



		}



		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}



	void rebuild() //5.重組文件,該含標記的員工從文件中刪除

	{

		char num[20];

		Staff *p = NULL, *temp = NULL;

		Staff *q = Head; //q是p的front

		cout << "正在重組文件..." << endl;

		for (p = Head->Next; p != End; p = p->Next, q = q->Next)

		{

			//cout<<"正在重組文件"<<endl;

			//cout<<strcmp(p->get_status(),"離職")<<endl;

			if (strcmp(p->get_status(), "離職") == 0)

			{

				if (p->Next != End) //若待刪除的是最後一項數據,則使用q指針

				{

					temp = p->Next;

					p->Next = p->Next->Next;

					delete temp;

				}

				else {

					temp = q->Next;

					q->Next = q->Next->Next;

					delete temp;

				}

			}

		}



		save();

		cout << "重組完畢!" << endl;



	}



	int findsum() //6.查詢總人數

	{

		int n = -1;

		Staff *p = Head->Next;

		while (p != NULL)

		{

			n++;

			p = p->Next;

		}

		cout << "員工總數爲:" << n - 1 << endl;

		return n - 1;



	}



	void display() //7.輸出所有員工信息

	{

		int n = findsum();

		int i = 1;

		Staff *p = Head->Next;



		cout << "總共有" << n << "名員工,其信息如下:" << endl;

		for (; p != End; p = p->Next)

		{

			cout << "第" << i << "名員工的信息爲:" << endl;

			p->show();

			cout << endl;

			i++;

		}





	}

};





class Salesman_file :virtual public Staff_file

{

protected:

	Salesman *Head, *End;

	//ifstream in;

	//ofstream out;



	Salesman *findItem(char *num)

	{

		for (Salesman *p = Head; p->Next != End; p = p->Next)

		{

			if (strcmp(p->Next->get_num(), num) == 0)

				return p;



		}



		return NULL;

	}







public:

	Salesman_file()

	{

		Head = new Salesman; //鏈表頭指針,不存儲數據

		Head->Next = new Salesman;

		End = Head->Next; //鏈表尾指針

		in.open("Salesman.txt");



		while (in.eof() != true) //從文件讀入到銷售員對象鏈表中

		{

			End->ReadFormFile(in);

			if (End->get_num()[0] == '\0')

				break;

			End->Next = new Salesman;

			End = End->Next;

		}

		in.close();

	}



	~Salesman_file()

	{

		for (Salesman *temp; Head->Next != End;)

		{

			temp = Head->Next;

			Head->Next = Head->Next->Next;

			delete temp;

		}

		delete Head, End;

	}



	void save() //將對象鏈表存入文件

	{



		out.open("Salesman.txt"); //默認輸出方式,若文件存在則刪除文件

		for (Salesman *p = Head->Next; p != End; p = p->Next)

		{

			out << p->get_num() << " " << p->get_name() << " " << p->get_age()

				<< " " << p->get_status() << " " << p->get_sales() << endl;

		}

		out.close();

	}



	void add() //1.增加銷售員信息

	{

		End->set_Salesman();

		End->Next = new Salesman;

		End = End->Next;

		save();

	}



	void find() //2.查詢銷售員信息功能

	{

		char num[20];

		Salesman *p = NULL;

		cout << "請輸入需要查詢的銷售員編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該銷售員的前驅

			p->Next->show(); //輸出銷售員信息

		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}







	void alter() //3.修改銷售員信息功能

	{

		char num[20];

		Salesman *p = NULL;

		cout << "請輸入要修改的銷售員編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該銷售員的前驅

		{

			p->Next->show(); //輸出銷售員信息

			cout << "請輸入新的信息" << endl;

			p->Next->set_Salesman();



		}



		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}



	void del() //4.刪除銷售員,即添加標記

	{

		char num[20];

		Salesman *p = NULL;

		cout << "請輸入要刪除的銷售員編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該銷售員的前驅

		{



			cout << "已刪除該銷售員,將其在職信息改爲“離職”,若要刪除該銷售員信息,請重組文件" << endl;

			p->Next->remove();



		}



		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}



	void rebuild() //5.重組文件,該含標記的銷售員從文件中刪除

	{

		char num[20];

		Salesman *p = NULL, *temp = NULL;

		Salesman *q = Head; //q是p的front

		cout << "正在重組文件..." << endl;

		for (p = Head->Next; p != End; p = p->Next, q = q->Next)

		{

			//cout<<"正在重組文件"<<endl;

			//cout<<strcmp(p->get_status(),"離職")<<endl;

			if (strcmp(p->get_status(), "離職") == 0)

			{

				if (p->Next != End) //若待刪除的是最後一項數據,則使用q指針

				{

					temp = p->Next;

					p->Next = p->Next->Next;

					delete temp;

				}

				else {

					temp = q->Next;

					q->Next = q->Next->Next;

					delete temp;

				}

			}

		}



		save();

		cout << "重組完畢!" << endl;

	}



	int findsum() //6.查詢總人數

	{

		int n = 0;

		Salesman *p = Head->Next;

		//cout<<"進入findsum"<<endl;

		while (p != End)

		{

			n++;

			p = p->Next;

		}

		//cout<<"進入findsum1"<<endl;



		cout << "銷售員總數爲:" << n << endl;

		return n;



	}



	void display() //7.輸出所有銷售員信息

	{

		//cout<<"進入display"<<endl;



		int n = findsum();

		//cout<<"進入display1"<<endl;



		int i = 1;

		Salesman *p = Head->Next;







		cout << "總共有" << n << "名銷售員,其信息如下:" << endl;

		for (; p != End; p = p->Next)

		{

			cout << "第" << i << "名銷售員的信息爲:" << endl;

			p->show();

			cout << endl;

			i++;

		}





	}

};





class Manager_file :virtual public Staff_file

{

protected:

	Manager *Head, *End;

	//ifstream in;

	//ofstream out;



	Manager *findItem(char *num)

	{

		for (Manager *p = Head; p->Next != End; p = p->Next)

		{

			if (strcmp(p->Next->get_num(), num) == 0)

				return p;



		}



		return NULL;

	}







public:

	Manager_file()

	{

		Head = new Manager; //鏈表頭指針,不存儲數據

		Head->Next = new Manager;

		End = Head->Next; //鏈表尾指針

		in.open("Manager.txt");



		while (in.eof() != true) //從文件讀入到經理對象鏈表中

		{

			End->ReadFormFile(in);

			if (End->get_num()[0] == '\0')

				break;

			End->Next = new Manager;

			End = End->Next;

		}

		in.close();

	}



	~Manager_file()

	{

		for (Manager *temp; Head->Next != End;)

		{

			temp = Head->Next;

			Head->Next = Head->Next->Next;

			delete temp;

		}

		delete Head, End;

	}



	void save() //將對象鏈表存入文件

	{

		out.open("Manager.txt"); //默認輸出方式,若文件存在則刪除文件

		for (Manager *p = Head->Next; p != End; p = p->Next)

		{

			out << p->get_num() << " " << p->get_name() << " " << p->get_age()

				<< " " << p->get_status() << " " << p->get_dept() << endl;

		}

		out.close();

	}



	void add() //1.增加經理信息

	{

		End->set_Manager();

		End->Next = new Manager;

		End = End->Next;

		save();

	}



	void find() //2.查詢經理信息功能

	{

		char num[20];

		Manager *p = NULL;

		cout << "請輸入需要查詢的經理編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該經理的前驅

			p->Next->show(); //輸出經理信息

		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}







	void alter() //3.修改經理信息功能

	{

		char num[20];

		Manager *p = NULL;

		cout << "請輸入要修改的經理編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該經理的前驅

		{

			p->Next->show(); //輸出經理信息

			cout << "請輸入新的信息" << endl;

			p->Next->set_Manager();



		}



		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}



	void dele() //4.刪除經理,即添加標記

	{

		char num[20];

		Manager *p = NULL;

		cout << "請輸入要刪除的經理編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該經理的前驅

		{



			cout << "已刪除該經理,將其在職信息改爲“離職”,若要刪除該經理信息,請重組文件" << endl;

			p->Next->remove();



		}



		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}



	void rebuild() //5.重組文件,該含標記的經理從文件中刪除

	{

		char num[20];

		Manager *p = NULL, *temp = NULL;

		Manager *q = Head; //q是p的front

		cout << "正在重組文件..." << endl;

		for (p = Head->Next; p != End; p = p->Next, q = q->Next)

		{

			//cout<<"正在重組文件"<<endl;

			//cout<<strcmp(p->get_status(),"離職")<<endl;

			if (strcmp(p->get_status(), "離職") == 0)

			{

				if (p->Next != End) //若待刪除的是最後一項數據,則使用q指針

				{

					temp = p->Next;

					p->Next = p->Next->Next;

					delete temp;

				}

				else {

					temp = q->Next;

					q->Next = q->Next->Next;

					delete temp;

				}

			}

		}



		save();

		cout << "重組完畢!" << endl;



	}



	int findsum() //6.查詢總人數

	{

		int n = -1;

		Manager *p = Head->Next;

		while (p != NULL)

		{

			n++;

			p = p->Next;

		}

		cout << "經理總數爲:" << n << endl;

		return n;



	}



	void display() //7.輸出所有經理信息

	{

		int n = findsum();

		int i = 1;

		Manager *p = Head->Next;



		cout << "總共有" << n << "名經理,其信息如下:" << endl;

		for (; p != End; p = p->Next)

		{

			cout << "第" << i << "名經理的信息爲:" << endl;

			p->show();

			cout << endl;

		}





	}

};



class SalesManager_file :public Salesman_file, public Manager_file

{

protected:

	SalesManager *Head, *End;

	//ifstream in;

	//ofstream out;



	SalesManager *findItem(char *num)

	{

		for (SalesManager *p = Head; p->Next != End; p = p->Next)

		{

			if (strcmp(p->Next->get_num(), num) == 0)

				return p;



		}



		return NULL;

	}







public:

	SalesManager_file()

	{

		Head = new SalesManager; //鏈表頭指針,不存儲數據

		Head->Next = new SalesManager;

		End = Head->Next; //鏈表尾指針

		in.open("SalesManager.txt");



		while (in.eof() != true) //從文件讀入到銷售經理對象鏈表中

		{

			End->ReadFormFile(in);

			if (End->get_num()[0] == '\0')

				break;

			End->Next = new SalesManager;

			End = End->Next;

		}

		in.close();

	}



	~SalesManager_file()

	{

		for (SalesManager *temp; Head->Next != End;)

		{

			temp = Head->Next;

			Head->Next = Head->Next->Next;

			delete temp;

		}

		delete Head, End;

	}



	void save() //將對象鏈表存入文件

	{

		out.open("SalesManager.txt"); //默認輸出方式,若文件存在則刪除文件

		for (SalesManager *p = Head->Next; p != End; p = p->Next)

		{

			out << p->get_num() << " " << p->get_name() << " " << p->get_age()

				<< " " << p->get_status() << " " << p->get_sales() << " " << p->get_dept() << endl;

		}

		out.close();

	}



	void add() //1.增加銷售經理信息

	{

		End->set_SalesManager();

		End->Next = new SalesManager;

		End = End->Next;

		save();

	}



	void find() //2.查詢銷售經理信息功能

	{

		char num[20];

		SalesManager *p = NULL;

		cout << "請輸入需要查詢的銷售經理編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該銷售經理的前驅

			p->Next->show(); //輸出銷售經理信息

		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}







	void alter() //3.修改銷售經理信息功能

	{

		char num[20];

		SalesManager *p = NULL;

		cout << "請輸入要修改的銷售經理編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該銷售經理的前驅

		{

			p->Next->show(); //輸出銷售經理信息

			cout << "請輸入新的信息" << endl;

			p->Next->set_SalesManager();



		}



		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}



	void del() //4.刪除銷售經理,即添加標記

	{

		char num[20];

		SalesManager *p = NULL;

		cout << "請輸入要刪除的銷售經理編號" << endl;

		cin >> num;

		if ((p = findItem(num)) != NULL) //查找該銷售經理的前驅

		{



			cout << "已刪除該銷售經理,將其在職信息改爲“離職”,若要刪除該銷售經理信息,請重組文件" << endl;

			p->Next->remove();



		}



		else

		{

			cout << "Not Found!" << endl;

		}

		save();

	}



	void rebuild() //5.重組文件,該含標記的銷售經理從文件中刪除

	{

		char num[20];

		SalesManager *p = NULL, *temp = NULL;

		SalesManager *q = Head; //q是p的front

		cout << "正在重組文件..." << endl;

		for (p = Head->Next; p != End; p = p->Next, q = q->Next)

		{

			//cout<<"正在重組文件"<<endl;

			//cout<<strcmp(p->get_status(),"離職")<<endl;

			if (strcmp(p->get_status(), "離職") == 0)

			{

				if (p->Next != End) //若待刪除的是最後一項數據,則使用q指針

				{

					temp = p->Next;

					p->Next = p->Next->Next;

					delete temp;

				}

				else {

					temp = q->Next;

					q->Next = q->Next->Next;

					delete temp;

				}

			}

		}



		save();

		cout << "重組完畢!" << endl;



	}



	int findsum() //6.查詢總人數

	{

		int n = -1;

		SalesManager *p = Head->Next;

		while (p != NULL)

		{

			n++;

			p = p->Next;

		}

		cout << "銷售經理總數爲:" << n << endl;

		return n;



	}



	void display() //7.輸出所有銷售經理信息

	{

		int n = findsum();

		int i = 1;

		SalesManager *p = Head->Next;



		cout << "總共有" << n << "名銷售經理,其信息如下:" << endl;

		for (; p != End; p = p->Next)

		{

			cout << "第" << i << "名銷售經理的信息爲:" << endl;

			p->show();

			cout << endl;

		}





	}

};



int main() {



	int m, n;

	Staff_file staff;

	Salesman_file salesman;

	Manager_file manager;

	SalesManager_file salesmanager;

	int quit = 0;

	while (quit == 0)

	{

		cout << "請輸入你所需要的功能:" << endl;

		cout << "1.輸出所有信息" << endl

			<< "2.查詢總人數" << endl

			<< "3.添加數據" << endl

			<< "4.更新數據" << endl

			<< "5.查詢數據" << endl

			<< "6.刪除數據" << endl

			<< "7.重組數據" << endl;

		cin >> m;

		cout << "請輸入你的操作對象:" << endl;

		cout << "1.員工" << endl

			<< "2.銷售員" << endl

			<< "3.經理" << endl

			<< "4.銷售經理" << endl;

		cin >> n;

		switch (m)

		{

		case 1:

		{

			switch (n)

			{

			case 1: {

				staff.display();

				break;

			}

			case 2: {

				salesman.display();

				break;

			}

			case 3: {

				manager.display();



				break;

			}

			case 4: {

				salesmanager.display();

				break;

			}

			default: {

				cout << "輸入有誤,請重新輸入!" << endl;

				break;

			}

			}



			break;

		}



		case 2: {

			switch (n)

			{

			case 1: {

				staff.findsum();

				break;

			}

			case 2: {

				salesman.findsum();

				break;

			}

			case 3: {

				manager.findsum();



				break;

			}

			case 4: {

				salesmanager.findsum();

				break;

			}

			default: {

				cout << "輸入有誤,請重新輸入!" << endl;

				break;

			}

			}

			break;

		}



		case 3: {

			switch (n)

			{

			case 1: {

				staff.add();

				break;

			}

			case 2: {

				salesman.add();

				break;

			}

			case 3: {

				manager.add();



				break;

			}

			case 4: {

				salesmanager.add();

				break;

			}

			default: {

				cout << "輸入有誤,請重新輸入!" << endl;

				break;

			}

			}

			break;

		}



		case 4: {

			switch (n)

			{

			case 1: {

				staff.alter();

				break;

			}

			case 2: {

				salesman.alter();

				break;

			}

			case 3: {

				manager.alter();



				break;

			}

			case 4: {

				salesmanager.alter();

				break;

			}

			default: {

				cout << "輸入有誤,請重新輸入!" << endl;

				break;

			}

			}

			break;

		}



		case 5: {

			switch (n)

			{

			case 1: {

				staff.find();

				break;

			}

			case 2: {

				salesman.find();

				break;

			}

			case 3: {

				manager.find();



				break;

			}

			case 4: {

				salesmanager.find();

				break;

			}

			default: {

				cout << "輸入有誤,請重新輸入!" << endl;

				break;

			}

			}

			break;

		}



		case 6: {

			switch (n)

			{

			case 1: {

				staff.del();

				break;

			}

			case 2: {

				salesman.del();

				break;

			}

			case 3: {

				manager.del();



				break;

			}

			case 4: {

				salesmanager.del();

				break;

			}

			default: {

				cout << "輸入有誤,請重新輸入!" << endl;

				break;

			}

			}

			break;

		}



		case 7: {

			switch (n)

			{

			case 1: {

				staff.rebuild();

				break;

			}

			case 2: {

				salesman.rebuild();

				break;

			}

			case 3: {

				manager.rebuild();



				break;

			}

			case 4: {

				salesmanager.rebuild();

				break;

			}

			default: {

				cout << "輸入有誤,請重新輸入!" << endl;

				break;

			}

			}

			break;

		}

		default: {

			cout << "輸入有誤,請重新輸入!" << endl;

			break;

		}

		}


		cout << endl << "輸入1退出,0繼續查詢" << endl;

		cin >> quit;



	}


	return 0;

}

 

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