⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 employee.cpp

📁 简单工资系统,是学习C++的好例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	p1=begin;
	while(p1!=end)
	{
		
		temp=p1;
		++temp;
		p2=temp;
		while(p2!=end)
		{			
			if ((**p1).getid()>(**p2).getid()) //每个排序不同的地方
			{
				iter_swap(p1,p2);
			}
			 ++p2;
		}
	 p1++;
	};

//	CFunction::report();
//	CFunction::print();

}
		

public:

   
//static ofstream employeeData;

static string salaryfilename;
static string employeefilename;
virtual void doIt()
{
    (*_p)();  //使用和声明是一致的。

	//如果把函数也当做一个类的话,那么就不用函数指针了。
	//比如有个函数类的接口,那么函数类实现接口就可以了。
	//那么只要传递函数类,就调用那个接口就好了。

	//即,函数对象<c++语言程序设计第三版> 郑莉,p362页
	//重载operator()

}


CFunction(void (*p)())
{
	_p=p;

}
static void push_back(CEmployee *a)
{
	_emplyeelist.push_back(a);	
}
static void inputManager()
{
    string name;
    string sex;
    string bith;
	system("cls");
	cout<<TOP;
	cout<<LEFT<<"    "<<"Manager之录入"<<endl<<endl;
    cout<<LEFT<<"姓名:";
    cin>>name;
    cout<<endl;

    cout<<LEFT<<"性别(男或女):";
    cin>>sex;
    cout<<endl;
    
    cout<<LEFT<<"生日(1983-6-30):";
    cin>>bith;
    cout<<endl;
    try{
        //BDay b(bith);
       // new CManager(name,sex,bith);
		
		CFunction::_emplyeelist.push_back(new CManager(name,sex,bith));
		cout<<LEFT<<"继续输入y/n?";
		string ch;
		cin>>ch;
		if ((ch=="y")||(ch=="Y")){
            inputManager();
        }else
        {

        }
		
    }
    catch(MyException e)
    {
        cout<<LEFT;
		e.printErrorCode();

		cout<<endl<<LEFT;
		system("pause");
		
		
		
		
    }

	

};
static void inputWage()
{
    string name;
    string sex;
    string bith;
	system("cls");
	cout<<TOP;
	cout<<LEFT<<"    "<<"Wage之录入"<<endl<<endl;
    cout<<LEFT<<"姓名:";
    cin>>name;
    cout<<endl;

    cout<<LEFT<<"性别(男或女):";
    cin>>sex;
    cout<<endl;

    cout<<LEFT<<"生日(1983-6-30):";
    cin>>bith;
    cout<<endl;
    try{

        
		
		CFunction::_emplyeelist.push_back(new CWage(name,sex,bith));
		cout<<LEFT<<"继续输入y/n?";
		string ch;
		cin>>ch;
		if ((ch=="y")||(ch=="Y")){
           inputWage();
		}
    }
    catch(MyException e)
    {
        cout<<LEFT;
		e.printErrorCode();
		cout<<endl<<LEFT;
		system("pause");
		
		
		
		
    }
	

};

static void inputSale()
{
    string name;
    string sex;
    string bith;
	system("cls");
	cout<<TOP;
	cout<<LEFT<<"    "<<"Sale之录入"<<endl<<endl;
    cout<<LEFT<<"姓名:";
    cin>>name;
    cout<<endl;

    cout<<LEFT<<"性别(男或女):";
    cin>>sex;
    cout<<endl;

    cout<<LEFT<<"生日(1983-6-30):";
    cin>>bith;
    cout<<endl;
    try{

        
		
		CFunction::_emplyeelist.push_back(new CSales(name,sex,bith));
		cout<<LEFT<<"继续输入y/n?";
		string ch;
		cin>>ch;
		if ((ch=="y")||(ch=="Y")){
           inputSale();
		}
    }
    catch(MyException e)
    {
        cout<<LEFT;
		e.printErrorCode();
		cout<<endl<<LEFT;
		system("pause");
		
    }
};
static void quit()
{
 CFunction::savetofile();


	
//new出来的存在于整个程序的运行期间,且退出的时候自然会清空,所以没有必要手动删除。另外指针的类型变了,

//detele会出错的。	
//把new出来的内容删掉
//list<CEmployee *>::iterator p=CFunction::_emplyeelist.begin();
/*
	while(p!=_emplyeelist.end())
	{
		delete (*p);
		p++;
	}
	delete (*p);

*/	

	exit(0);

};




static void sortbysalary()
{


	list<CEmployee *>::iterator begin,end,p1,p2,temp;
	begin=CFunction::_emplyeelist.begin();
	end=CFunction::_emplyeelist.end();
//因为用迭代器,有些指针有的操作迭代器没有,所以下边的代码看起来可能会有些奇怪
	//而且即使用for,判断停止的时候一样是用!=。

	p1=begin;
	while(p1!=end)
	{
		
		temp=p1;
		++temp;
		p2=temp;
		while(p2!=end)
		{			
			if ((**p1).computePay()<(**p2).computePay()) //每个排序不同的地方
			{
				iter_swap(p1,p2);
			}
			 ++p2;
		}
	 p1++;
	};

	CFunction::report();
	CFunction::print();

}

static void sortbyname()
{


	list<CEmployee *>::iterator begin,end,p1,p2,temp;
	begin=CFunction::_emplyeelist.begin();
	end=CFunction::_emplyeelist.end();
//因为用迭代器,有些指针有的操作迭代器没有,所以下边的代码看起来可能会有些奇怪
	//而且即使用for,判断停止的时候一样是用!=。

	p1=begin;
	while(p1!=end)
	{
		
		temp=p1;
		++temp;
		p2=temp;
		while(p2!=end)
		{			
			if ((**p1).EmpolyeeName()<(**p2).EmpolyeeName()) //每个排序不同的地方
			{
				iter_swap(p1,p2);
			}
			 ++p2;
		}
	 p1++;
	};

	CFunction::report();
	CFunction::print();
}

static void sortbyposition()
{


	list<CEmployee *>::iterator begin,end,p1,p2,temp;
	begin=CFunction::_emplyeelist.begin();
	end=CFunction::_emplyeelist.end();
//因为用迭代器,有些指针有的操作迭代器没有,所以下边的代码看起来可能会有些奇怪
	//而且即使用for,判断停止的时候一样是用!=。

	p1=begin;
	while(p1!=end)
	{
		
		temp=p1;
		++temp;
		p2=temp;
		while(p2!=end)
		{			
			if ((**p1).getPosition()<(**p2).getPosition()) //每个排序不同的地方.此处也可以将职位分等级,如果不分的话同类也会在一起,只是不同职位的顺序是根据汉字排的,而不是根据职位的高低
			{
				iter_swap(p1,p2);
			}
			 ++p2;
		}
	 p1++;
	};

	CFunction::report();
	CFunction::print();

}
static void outtoconsole()
{
	CFunction::sortbyid();
	CFunction::print();

}

static void querybyname()
{
	system("cls");
	string name;
	cout<<"请输入查询的职员名字:";
	cin>>name;
	cout<<endl<<"查询结果"<<endl;
	CEmployee::printInfoHint();

	list<CEmployee *>::iterator p=CFunction::_emplyeelist.begin();
	while(p!=_emplyeelist.end())
	{	

		if ((**p).EmpolyeeName()==name){
			
			(*p)->printInfo();
		}
		p++;
		
	}
	system("pause");

}
static void querybyposition()
{
	system("cls");
	string name;
	cout<<"请输入查询的职位(经理,时工,销售):";
	cin>>name;
	cout<<endl<<"查询结果"<<endl;
	CEmployee::printInfoHint();

	list<CEmployee *>::iterator p=CFunction::_emplyeelist.begin();
	while(p!=_emplyeelist.end())
	{	

		if ((**p).getPosition()==name){
			
			(*p)->printInfo();
		}
		p++;
		
	}
	system("pause");

}

static void querybyid()
{
	system("cls");
	string name;
	cout<<"请输入职员编号:";
	cin>>name;
	cout<<endl<<"查询结果"<<endl;
	CEmployee::printInfoHint();

	int id;
	id=atoi(name.c_str());

	bool found=false;

	list<CEmployee *>::iterator p=CFunction::_emplyeelist.begin();
	while(p!=_emplyeelist.end())
	{	

		if ((**p).getid()==id){
			
			(*p)->printInfo();
			found=true;
			break;//因为id是唯一的,跳出while,并利用此时的迭代器的位置进行操作,
		}
		p++;
		
	}

	if (found==true)
	{
		if ((**p).getPosition()=="经理")
		{
			
			
			string temp;
			

			//觉得下边这样写更安全,不会把list里的转换了。
			CEmployee* ce;
			ce=*p;

			cout<<endl<<"设置该经理的薪金:";
			cin>>temp;
			(static_cast<CManager *>(ce))->setSalary(atof(temp.c_str()));
			//因为指针没有什么类不类,所以不用dynamic_cast
			
			cout<<endl<<"修改后的结果为:"<<endl;
			CEmployee::printInfoHint();
			(*p)->printInfo();
			
		}

		if ((**p).getPosition()=="时工")
		{
			
			string temp;
			
			//觉得下边这样写更安全,不会把list里的转换了,也许想多了,不过没副作用。
			CEmployee* ce;
			ce=*p;

			cout<<endl<<"设置该职员的时薪:";
			cin>>temp;
			(static_cast<CWage *>(ce))->setWage(atof(temp.c_str()));
		
			cout<<"设置该职员的工作时间:";
			cin>>temp;
			(static_cast<CWage *>(ce))->setHours(atof(temp.c_str()));
			
			cout<<endl<<"修改后的结果为:"<<endl;
			CEmployee::printInfoHint();
			(*p)->printInfo();
		
		}
		if ((**p).getPosition()=="销售")
		{
			
			string temp;
		
			//觉得下边这样写更安全,不会把list里的转换了,也许想多了,不过没副作用。
			CEmployee* ce;
			ce=*p;

			cout<<endl<<"设置该职员的时薪:";
			cin>>temp;
			(static_cast<CSales *>(ce))->setWage(atof(temp.c_str()));
		
			cout<<"设置该职员的工作时间:";
			cin>>temp;
			(static_cast<CSales *>(ce))->setHours(atof(temp.c_str()));

			cout<<"设置该职员的提成:";
			cin>>temp;
			(static_cast<CSales *>(ce))->setCommission(atof(temp.c_str()));

			cout<<"设置该职员的销售数量:";
			cin>>temp;
			(static_cast<CSales *>(ce))->setSales(atof(temp.c_str()));
			
			cout<<endl<<"修改后的结果为:"<<endl;
			CEmployee::printInfoHint();
			(*p)->printInfo();
		
		}

	}


	system("pause");

}

static void savetofile()
{
	CFunction::sortbyid();
	CFunction::save();

}
static void loadformfile()
{
	CFunction::load();
}
static void setemployeefile(string name)
{
	CFunction::employeefilename=name;
}
static void setsalaryfile(string name)
{
	CFunction::salaryfilename=name;
}

};



const string CFunction::TOP="\n\n\n\n\n\n\n";
const string CFunction::LEFT="                            ";
list<CEmployee *> CFunction::_emplyeelist;
//ofstream CFunction::employeeData;
//ofstream CFunction::salarydata;
string CFunction::salaryfilename="salary.txt";//也可以调用setsalaryfile设置
string CFunction::employeefilename="employee.txt";
 /**********************************************/
 /**********************************************/

void main()
{


//	CFunction::employeeData.open("employee.data",ios::app);

	Menu mainmenu;	
	Menu menuinput;
	Menu menuquery;
	Menu menuout;
	Menu menusort;


	//生成输入菜单
        menuinput.addTitle("输入雇员信息");

		CFunction finputManager(CFunction::inputManager);  //传入函数指针的方法
        CFunction finputWage(CFunction::inputWage);
        CFunction finputSale(CFunction::inputSale);
		
		menuinput.addMenu("Manager之录入",&finputManager);
        menuinput.addMenu("Wage之录入",&finputWage);
		menuinput.addMenu("Sale之录入",&finputSale);
		
		menuinput.addMenu("返回",&mainmenu);
	//生成查询菜单
		menuquery.addTitle("查询菜单");
		CFunction fquerybyname(CFunction::querybyname);
		CFunction fquerybyp(CFunction::querybyposition);
		CFunction fquerybyid(CFunction::querybyid);

		menuquery.addMenu("按姓名查询",&fquerybyname);
		menuquery.addMenu("按职位查询",&fquerybyp);
		menuquery.addMenu("按编号查询并修改信息",&fquerybyid);
		menuquery.addMenu("返回",&mainmenu);


	//生成输出菜单
		menuout.addTitle("雇员信息输出");

		CFunction fout(CFunction::outtoconsole);
		CFunction fsave(CFunction::savetofile);

		menuout.addMenu("输出到控制台",&fout);
		menuout.addMenu("输出到文件",&fsave);

		menuout.addMenu("返回",&mainmenu);
	
	//生成排序菜单
		menusort.addTitle("雇员信息报表");
		CFunction fsortbysalary(CFunction::sortbysalary);
		CFunction fsortbyname(CFunction::sortbyname);
		CFunction fsortbyP(CFunction::sortbyposition);


		menusort.addMenu("按薪金排序",&fsortbysalary);
		menusort.addMenu("按名字排序",&fsortbyname);
		menusort.addMenu("按职位排序",&fsortbyP);
		menusort.addMenu("返回",&mainmenu);
   
	//生成主菜单
        CFunction fquit(CFunction::quit);
		mainmenu.addTitle("主菜单");
        mainmenu.addMenu("输入雇员信息",&menuinput);
        mainmenu.addMenu("雇员信息查询",&menuquery);
        mainmenu.addMenu("雇员信息输出",&menuout);
        mainmenu.addMenu("雇员信息报表",&menusort);
        mainmenu.addMenu("退出",&fquit);
		

	CFunction::loadformfile();

	
	mainmenu.show();




	


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -