📄 pro.txt
字号:
/*本程序有关的两个数据文件:
base.txt-基础数据文件(必须存在,且按规定格式保存)
person.txt-人员信息文件(可选)
*/
#include <iostream.h>
#include <fstream.h>
#include <ctype.h>
#include <string.h>
//全局数据,对象
double ManagerSalary; //经理固定月薪
double SalesManagerSalary; //销售经理固定月薪
double SalesManagerPercent; //销售经理提成%
double SalesPercent; //销售人员提成%
double WagePerHour; //技术人员小时工资
int ID; //员工标识(要保证唯一)
class Person //员工类
{
protected:
int No; //编号
char Name[20]; //姓名
int Duty; //岗位
double Earning; //收入
Person *next;
public:
Person(char ID,char *Name,int Duty)
{
this->Duty=Duty;
strcpy(this->Name,Name);
this->No=ID;
}
virtual void CalcSalary()=0;
virtual void Output()=0;
friend class Company;
};
class Manager:public Person //经理类
{
public:
Manager(char ID,char *Name,int Duty):Person(ID,Name,Duty){}
void CalcSalary(){Earning=ManagerSalary;}
void Output()
{
CalcSalary();
cout<<No<<"\t"<<Name<<"\t经理\t"<<Earning<<endl;
}
};
class SalesManager:public Person //销售经理类
{
private:
double Amount;
public:
SalesManager(char ID,char *Name,int Duty):Person(ID,Name,Duty){}
void SetAmount(double s)
{
Amount=s;
}
void CalcSalary()
{
Earning=SalesManagerSalary+Amount*SalesManagerPercent/100;
}
void Output()
{
CalcSalary();
cout<<No<<"\t"<<Name<<"\t销售经理\t"<<Earning<<endl;
}
};
class Technician:public Person //技术员类
{
private:
double t;
public:
Technician(char ID,char *Name,int Duty,double T):Person(ID,Name,Duty)
{
this->t=T;
}
double GetT()
{
return t;
}
void SetT(double T)
{
this->t=T;
}
void CalcSalary()
{
Earning=WagePerHour*t;
}
void Output()
{
CalcSalary();
cout<<No<<"\t"<<Name<<"\t技术员\t"<<t<<"\t"<<Earning<<endl;
}
};
class Sales:public Person //销售员类
{
private:
double Amount;
public:
Sales(char ID,char *Name,int Duty,double Amount):Person(ID,Name,Duty)
{
this->Amount=Amount;
}
double GetAmount()
{
return Amount;
}
void SetAmount(double Amount)
{
this->Amount=Amount;
}
void CalcSalary()
{
Earning=SalesPercent/100*Amount;
}
void Output()
{
CalcSalary();
cout<<No<<"\t"<<Name<<"\t销售员\t"<<Amount<<"\t"<<Earning<<endl;
}
};
class Company //公司类
{
private:
Person *Worker; //员工表
void Clear(); //清除内存中数据
public:
Company()
{
Worker=0;
Load();
}
~Company()
{
Person *p;
p=Worker;
while(p)
{
p=p->next;
delete Worker;
Worker=p;
}
Worker=0;
}
void Add(); //增加人员
void Query(); //查询人员
void Set(); //基础数据设置
void Save(); //数据存盘(包括基础数据,人员数据)
void Load(); //数据装入(包括基础数据,人员数据)
};
void Company::Clear() //清除内存中人员数据(内部使用)
{
Person* p=Worker;
while(p)
{
Worker=p->next;
delete p;
p=Worker;
}
}
void Company::Add()
{
Person *p; //新结点指针
int Duty;
char Name[20];
double Amount,T;
cout<<"\n** 新增员工 **\n";
//输入员工信息
ID++;
cout<<"输入岗位(1-经理2-销售经理3-销售员4-技术员):"; cin>>Duty;
cout<<"输入姓名:"; cin>>Name;
if(Duty==3)
{
cout<<"本月销售额:"; cin>>Amount;
}
else if(Duty==4)
{
cout<<"本月工作小时数(0-168):";
cin>>T;
}
//创建新员工结点
switch(Duty)
{
case 1:p=new Manager(ID,Name,Duty); break;
case 2:p=new SalesManager(ID,Name,Duty); break;
case 3:p=new Sales(ID,Name,Duty,Amount); break;
case 4:p=new Technician(ID,Name,Duty,T); break;
}
p->next=0;
//员工结点加入链表
if(Worker) //若已经存在结点
{
Person *p2;
p2=Worker;
while(p2->next) //查找尾结点
{
p2=p2->next;
}
p2->next=p; //连接
}
else //若不存在结点(表空)
{
Worker=p; //连接
}
}
void Company::Query()
{
cout<<"\n** 查询人员本月销售信息 **\n";
double sum=0; //销售额总和
Person *p=Worker;
while(p)
{
if(p->Duty==3)sum+=((Sales *)p)->GetAmount();
p=p->next;
}
p=Worker;
double sum2=0; //工资总和
while(p)
{
if(p->Duty==2)((SalesManager *)p)->SetAmount(sum);
p->Output();
sum2+=p->Earning;
p=p->next;
}
cout<<"本月盈利:"<<sum*0.20-sum2<<endl;
cout<<"(按照20%利润计算)\n";
}
void Company::Set()
{
cout<<"\n** 设置基础数据 **\n";
cout<<"经理固定月薪["<<ManagerSalary<<"元]:";
cin>>ManagerSalary;
cout<<"销售经理固定月薪["<<SalesManagerSalary<<"元]:";
cin>>SalesManagerSalary;
cout<<"销售经理提成["<<SalesManagerPercent<<"%]:";
cin>>SalesManagerPercent;
cout<<"销售人员提成["<<SalesPercent<<"%]:";
cin>>SalesPercent;
cout<<"技术人员小时工资["<<WagePerHour<<"(元/小时)]:";
cin>>WagePerHour;
cout<<"员工标识[>="<<ID<<"]:";
cin>>ID;
}
void Company::Save() //数据存盘(包括基础数据,人员数据),均采用文本文件
{
ofstream fPerson,fBase;
char c;
cout<<"\n保存人员和基础数据,是否继续?[Y/N]:"; cin>>c;
if(toupper(c)!='Y')return;
//保存人员编号、姓名、岗位
fPerson.open("person.txt",ios::out);
Person *p=Worker;
while(p)
{
fPerson<<p->No<<"\t"<<p->Name<<"\t"<<p->Duty<<"\t";
if(p->Duty==3)
fPerson<<((Sales*)p)->GetAmount()<<"\t";
else if(p->Duty==4)
fPerson<<((Technician *)p)->GetT()<<"\t";
fPerson<<endl;
p=p->next;
}
fPerson.close();
//保存基础数据
fBase.open("base.txt",ios::out);
fBase<<"经理固定月薪\t"<<ManagerSalary<<endl;
fBase<<"销售经理固定月薪\t"<<SalesManagerSalary<<endl;
fBase<<"销售经理提成%\t"<<SalesManagerPercent<<endl;
fBase<<"销售人员提成%\t"<<SalesPercent<<endl;
fBase<<"技术人员小时工资\t"<<WagePerHour<<endl;
fBase<<"ID\t"<<ID<<endl;
fPerson.close();
cout<<"\n保存人员和基础数据已经完成...\n";
}
void Company::Load() //数据装入(包括基础数据,人员数据)
{
//基础数据装入
ifstream fBase;
char buf[80]; //buf用于保存数据文件中的注释字符串
fBase.open("base.txt",ios::in);
fBase>>buf>>ManagerSalary; //经理固定月薪
fBase>>buf>>SalesManagerSalary; //销售经理固定月薪
fBase>>buf>>SalesManagerPercent; //销售经理提成%
fBase>>buf>>SalesPercent; //销售人员提成%
fBase>>buf>>WagePerHour; //技术人员小时工资
fBase>>buf>>ID; //员工标识
fBase.close();
//清除内存人员数据
Clear();
//人员数据数据装入
ifstream fPerson;
Person *p=Worker;
int No; char Name[20]; int Duty;
double Amount,T;
fPerson.open("person.txt",ios::in);
//读一条记录
fPerson>>No>>Name>>Duty;
if(Duty==3)fPerson>>Amount;
else if(Duty==4)fPerson>>T;
while(fPerson.good())
{
//创建员工结点
switch(Duty)
{
case 1:p=new Manager(No,Name,Duty); break;
case 2:p=new SalesManager(No,Name,Duty); break;
case 3:p=new Sales(No,Name,Duty,Amount); break;
case 4:p=new Technician(No,Name,Duty,T); break;
}
p->next=0;
//员工结点加入链表
if(Worker) //若已经存在结点
{
Person *p2;
p2=Worker;
while(p2->next) //查找尾结点
{
p2=p2->next;
}
p2->next=p; //连接
}
else //若不存在结点(表空)
{
Worker=p; //连接
}
//读下一条记录
fPerson>>No>>Name>>Duty;
if(Duty==3)fPerson>>Amount;
else if(Duty==4)fPerson>>T;
}
fPerson.close();
cout<<"\n人员和基础数据已经装入...\n";
}
void main()
{
char c;
Company a;
do
{
cout<<"\n*** 公司人员管理系统 ***\n";
cout<<"1-增加人员\n";
cout<<"2-查询本月经营信息\n";
cout<<"3-基础数据设置\n";
cout<<"4-数据存盘\n";
cout<<"5-数据装入\n";
cout<<"6-退出\t请选择(1-6):";
cin>>c;
switch(c)
{
case '1': a.Add(); break;
case '2': a.Query(); break;
case '3': a.Set(); break;
case '4': a.Save(); break;
case '5': a.Load(); break;
}
}while(c!='6');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -