📄 employee.cpp
字号:
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 + -