十万火急,求解。C语言货C++编程!!求解。

发布网友

我来回答

3个回答

热心网友

#include <cstdlib> // c standard library
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cmath>
#include <conio.h>
#include <crtdbg.h>
#include <fstream>
#include <algorithm>
#include <functional>
#include <vector>
#include <string>
#include <hash_map>
#include <fstream>
#include <set>

using namespace std;
using namespace stdext;

enum{
TYPE_EMPLOYEE,
TYPE_MANAGER,
TYPE_TOTAL_MGR,
TYPE_TECH_MGR,
TYPE_SALES_MGR,
TYPE_SALESMAN,
TYPE_TECHNICIAN,
};

class ISalaryCalculator//接口类
{
public:
virtual float CalcSalary() = 0;

};
class ISerializable
{ int type;
public:
ISerializable()
{
Type(TYPE_INUALID);
}
virtual ~ISerializable(){}
virtual bool Save(ofstream & ofs)=0;
virtual bool Load(ifstream & ifs)=0;
};

class FloatSalaryCalculator : virtual public ISalaryCalculator
{
float unitSalary;
float rate;
public:
FloatSalaryCalculator(float unitSalary, float rate)
:unitSalary(unitSalary)
,rate(rate)
{}
virtual float CalcSalary()
{
return unitSalary*rate;
}
};

class BaseSalaryCalculator : virtual public ISalaryCalculator//基本工资计算
{
float baseSalary;
public:
BaseSalaryCalculator(float baseSalary)
:baseSalary(baseSalary)
{}
virtual float CalcSalary()
{
return baseSalary;
}
virtual bool Save(ofstream & ofs)
{
ofs << baseSalary << endl;
return true;
}
virtual bool Load(ifstream & ifs)
{
ifs >> baseSalary;
return true;
}
};
class TechnicianManagerSalaryCalculator:public BaseSalaryCalculator
{
public:
TechnicianManagerSalaryCalculator(float baseSalary)
:BaseSalaryCalculator(baseSalary)
{}
virtual float CalcSalary()
{
return BaseSalaryCalculator::CalcSalary();
}
};

class SalesManagerSalaryCalculator : public BaseSalaryCalculator, public FloatSalaryCalculator//销售经理薪水计算
{
public:
SalesManagerSalaryCalculator(float baseSalary, float amount, float ptg)
:BaseSalaryCalculator(baseSalary)
,FloatSalaryCalculator(amount, ptg)
{}
virtual float CalcSalary()
{
return BaseSalaryCalculator::CalcSalary()+FloatSalaryCalculator::CalcSalary();
}
};
class SaleManSalaryCalculator:public FloatSalaryCalculator
{
public:
SaleManSalaryCalculator(float amount,float ptg)
:FloatSalaryCalculator(amount,ptg)
{}
virtual float CalcSalary()
{
return FloatSalaryCalculator::CalcSalary();
}
};

class Employee//虚基类
{
int id;
string name;
int grade;
float salary;
int type;
static int s_id;
ISalaryCalculator * salaryCalculator;

public:
Employee(int type, ISalaryCalculator * salaryCalculator)
:id(s_id++)
,grade(1)
,salary(0)
,type(type)
,salaryCalculator(salaryCalculator)
{}
virtual ~Employee(){}
virtual bool Save(ofstream & ofs)
{
ofs<<id<<endl;
ofs<<name<<endl;
ofs<<grade<<endl;
return true;

}
virtual bool Load(ifstream & ifs)
{
ifs>>id;
ifs>>name;
ifs>>grade;
return true;
}

virtual void Display()
{
cout << "ID: " << id << endl;
cout << "Name: " << name << endl;
cout << "Grade: " << grade << endl;
cout << "Salary: " << salary << endl;
}
virtual void Promote() = 0;
float CalcSalary()
{
return salaryCalculator->CalcSalary();
}

std::string Name() const { return name; }
void Name(std::string val) { name = val; }
int Id() const { return id; }
void Id(int val)
{
if (val < 1000) throw exception("员工ID号不能小于1000!");
id = val;
}
int Grade() const { return grade; }
void Grade(int val) { grade = val; }
float Salary() const { return salary; }
void Salary(float val) { salary = val; }
int Type() const { return type; }
void Type(int val) { type = val; }
};

int Employee::s_id = 1000;
class TechnicianManager:public Employee
{
public:
TechnicianManager(ISalaryCalculator * salaryCalculator):Employee(TYPE_TECH_MGR,salaryCalculator){}
virtual void Promote()
{
if(Grade()<4)
Grade((Grade()+1));
}
};
class SaleMan:public Employee
{
public:
SaleMan(ISalaryCalculator * salaryCalculator):Employee(TYPE_SALESMAN,salaryCalculator){}
virtual void Promote()
{
if(Grade()<3)
Grade(Grade()+1);
}
};

class SalesManager : public Employee//销售经理
{
public:
SalesManager(ISalaryCalculator * salaryCalculator):Employee(TYPE_SALES_MGR, salaryCalculator){}

virtual void Promote()
{
if (Grade() < 4)
Grade(Grade()+1);
}//等级为4
};
class Technician : public Employee//技术员
{
public:
Technician(ISalaryCalculator * salaryCalculator):Employee(TYPE_TECHNICIAN, salaryCalculator){}

virtual void Promote()//等级为3
{
if (Grade() < 3)
Grade(Grade()+1);
}
};
class EmployeeManager//虚基类的管理 增删改查
{
typedef set<Employee*> EmployeeSet;
EmployeeSet employees;

public:
void Add(Employee * pe)
{
employees.insert(pe);
}

void Delete(Employee * pe)
{
EmployeeSet::iterator it = employees.find(pe);
if (it != employees.end())
employees.erase(it);
}

Employee * FindById(int id)
{
for (EmployeeSet::iterator it = employees.begin();
it != employees.end(); ++it)
{
Employee* pe = *it; // shortcut
if (pe->Id() == id)
return pe;
}
return NULL;
}
void Print()
{
for(EmployeeSet::iterator it=employees.begin();
it!=employees.end();++it)
{
Employee* pe=*it;
pe->Display();
}
}
bool Load(const string fileName)
{
ifstream ifs(fileName.c_str());
EmployeeSet::size_type employeeCnt;
ifs>>employeeCnt;
for(int i=0;i<employeeCnt;i++)

{ int type;
ifs>>type;

Employee* pe=NULL;
switch(type)
{
case TYPE_TECHNICIAN:
{
pe=new Technician(NULL);
}
break;
case TYPE_SALES_MGR:
{
pe=new SalesManager(NULL);
}break;
case TYPE_TECH_MGR:
{
pe=new TechnicianManager(NULL);

}break;
case TYPE_SALESMAN:
{
pe=new SaleMan(NULL);
}break;
}
pe->Load(ifs);
employees.insert(pe);
}
ifs.close();
return true;
}
bool Save(const string & fileName)
{
ofstream ofs(fileName.c_str());
for(EmployeeSet::iterator it=employees.begin();
it!=employees.end();++it)
{
Employee*pe=*it;
pe->Save(ofs);
}
ofs.close();
return true;
}
};

void main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

EmployeeManager em;
bool isQuit=false;
do
{ system("cls");
cout<<""<<endl;
cout << "1.增加员工"<<endl;
cout<<"2.修改员工"<<endl;
cout<<"3.删除员工"<<endl;
cout<<"4.员工离职"<<endl;
cout<<"5.员工转岗"<<endl;
cout<<"6.员工升职"<<endl;
cout<<"7.信息存盘"<<endl;
cout<<"8.信息读盘"<<endl;
cout<<"9.打印员工信息"<<endl;
cout<<"0.退出"<<endl;
cout<<"请输入选择"<<endl;
int select;
cin >> select;
system("cls");
switch (select)
{
case 0:
{
isQuit=true;
}break;
case 1:
{
cout << "1.增加技术员"<<endl;
cout << "2.增加销售经理"<<endl;
cout<<"3.增加技术经理"<<endl;
cout<<"4.增加销售员"<<endl;
cout<<"0.返回上级菜单"<<endl;
cin >> select;
switch (select)
{
case 0:break;

case 1://技术员信息
{
string name;
int grade;
float salary;
float workHour;
float hourSalary;
cout<<"请输入工作时间:"<<endl;
cin >> workHour;
cout<<"请输入小时薪水:"<<endl;
cin >> hourSalary;
Technician * pe = new Technician(new FloatSalaryCalculator(hourSalary, workHour));
cout<<"请输入姓名:"<<endl;
cin >> name;
pe->Name(name);
cout<<"请输入等级:"<<endl;
cin >> grade;
pe->Grade(grade);
em.Add(pe);
}
break;
case 2://销售经理信息
{
string name;
int grade;
float salary;
int ptg;
float amount;
float baseSalary;
cout<<"请输入薪水:"<<endl;
cin >> baseSalary;
cout<<"请输入总额:"<<endl;
cin >> amount;
cout<<"请输入百分比:"<<endl;
cin >> ptg;
SalesManager * pe = new SalesManager(new SalesManagerSalaryCalculator(baseSalary, amount, ptg));
cout<<"请输入姓名:"<<endl;
cin >> name;
pe->Name(name);
cout<<"请输入等级"<<endl;
cin >> grade;
pe->Grade(grade);
em.Add(pe);
}
break;
case 3:
{
string name;
int grade;
float salary;
float baseSalary;
cin>>baseSalary;
TechnicianManager *pe=new TechnicianManager(new TechnicianManagerSalaryCalculator(baseSalary));
cin>>name;
pe->Name(name);
cin>>grade;
pe->Grade(grade);
cin>>salary;
pe->Salary(salary);
em.Add(pe);
}
break;
case 4:
{
string name;
int grade;
float salary;
int ptg;
float amount;
float baseSalary;

cin >> baseSalary;
cin >> amount;
cin >> ptg;

SaleMan * pe= new SaleMan(new SaleManSalaryCalculator( amount, ptg));

cin >> name;
pe->Name(name);
cin >> grade;
pe->Grade(grade);
cin >> salary;
pe->Salary(salary);

em.Add(pe);
}
}

}
//case 2:
// {
// cout<<"修改员工信息";
// }break;
case 7:
{
em.Load("HrSystem.dat");
}break;
case 8:
{
em.Save("HrSystem.dat");
}

case 9:
{
em.Print();
}break;

}
cout<<"按任意键继续!"<<endl;

}while (getch()!=27&&!isQuit);
system("pause");
}
我是用2005vc的,我当时做的,没坐全,你看看,自己修改一下就可以了,能通过编译的,现在。可能有点不一样,你看懂了改一下就好了

热心网友

你这个问题用百度和谷歌一搜一大堆,

热心网友

自己动手做一做,总会有收获的。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com