C++大作业——销售公司员工管理
面向对象程序设计大作业
目录
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;
}