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;

}

 

发布了47 篇原创文章 · 获赞 28 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41122796/article/details/86644391