面向對象程序設計大作業
目錄
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;
}