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) 即统一建模语言,画类图是有一定标准的,具体如下:

虚线箭头指向依赖;

实线箭头指向关联;

虚线三角指向接口;

实线三角指向基类;

空心菱形能分离而独立存在,是聚合;

实心菱形精密关联不可分,是组合;

C++大作业——销售公司员工管理

C++大作业——销售公司员工管理

由于UML图能够清晰的表达出类的设计,画类图时应按上述标准作图。

3.2本题类图

 

我一共设计了八个类,其UML图如下:

(由于作图工具画不出实线三角,只能使用实心箭头代替)下面两张类图画下面两个箭头的时候画反了。。。

 

 

C++大作业——销售公司员工管理

 

 

图1:员工类、销售员类、经理类、销售经理类的类图

 

其中图成员变量num为编号,name为名字,age为年龄,status为在职状态,get方法为获得相应成员变量值的函数,show方法输出该条数据信息(一个对象代表文件中一条数据),remove方法即添加删除标记,将status置为离职,ReadFromFile方法从文件流中读入一条数据初始化当前对象。

 

C++大作业——销售公司员工管理

 

实现文件操作类的类图如下:

 

图2:文件操作类的类图

 

其中Head为指向对象链表的头指针,End是链表尾指针,in为文件输入流对象,out为文件输出流对象,构造函数从文件读入数据初始化对象链表,析构函数删除链表和头尾指针,findItem方法以员工编号查找相应对象,返回对象指针,save方法用out文件输出流对象将变动更新至相应文件,add方法实现添加信息功能,find方法实现查询功能,alter方法实现修改功能 ,del方法实现删除功能,rebuild方法实现文件重组功能,findsum方法实现查询人员总数功能,display方法实现输出所有信息功能。

 

4.运行结果

文本文件位于工作环境中

C++大作业——销售公司员工管理

 

 

以销售员为例

查询之前销售员文件内容

C++大作业——销售公司员工管理

 

 

 

 

分别执行七个功能

1.输出所有信息

C++大作业——销售公司员工管理

 

2.查询总人数

C++大作业——销售公司员工管理

3.添加数据

C++大作业——销售公司员工管理

 

文件内容为

C++大作业——销售公司员工管理

 

成功向文件添加信息

4.更新数据

C++大作业——销售公司员工管理

 

文件内容为

C++大作业——销售公司员工管理

 

更新文件内容成功

 

 

 

5.查询数据

C++大作业——销售公司员工管理

 

6.删除数据

 

C++大作业——销售公司员工管理

文件中的内容为

C++大作业——销售公司员工管理

 

7.重组数据

C++大作业——销售公司员工管理

 

文件内容为

C++大作业——销售公司员工管理

 

 

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;

}