面向对象程序设计大作业
目录
面向对象程序设计大作业
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<<"正在重组文件..."<
for(p=Head->Next;p!=End;p=p->Next,q=q->Next)
{
//cout<<"正在重组文件"<
//cout<get_status(),"离职")<
if(strcmp(p->get_status(),"离职")==0)
{
temp=p->Next;
p->Next=p->Next->Next;
delete temp;
}
}
save();
cout<<"重组完毕!"<
}
经过调试后,我发现问题在于代码段
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<<"正在重组文件..."<
for(p=Head->Next;p!=End;p=p->Next,q=q->Next)
{
//cout<<"正在重组文件"<
//cout<get_status(),"离职")<
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<<"重组完毕!"<
}
此时可以正常运行
6.源代码
#include
#include
#include
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<<"正在重组文件"<get_status(),"离职")<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<<"正在重组文件"<get_status(),"离职")<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"<Next;
}
//cout<<"进入findsum1"<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<<"正在重组文件"<get_status(),"离职")<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<<"正在重组文件"<get_status(),"离职")<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;
}