源代码
#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 Delete(); //删除人员
void Modify(); //修改人员
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::Delete() //删除人员
{
int No;
cout<<"\n** 删除员工 **\n";
cout<<"ID:"; cin>>No;
//查找要删除的结点
Person *p1,*p2; p1=Worker;
while(p1)
{
if(p1->No==No)
break;
else
{
p2=p1;
p1=p1->next;
}
}
//删除结点
if(p1!=NULL)//若找到结点,则删除
{
if(p1==Worker) //若要删除的结点是第一个结点
{
Worker=p1->next;
delete p1;
}
else //若要删除的结点是后续结点
{
p2->next=p1->next;
delete p1;
}
cout<<"找到并删除\n";
}
else //未找到结点
cout<<"未找到!\n";
}
void Company::Modify()
{
int No,Duty;
char Name[20];
double Amount,T;
cout<<"\n** 修改员工 **\n";
cout<<"ID:"; cin>>No;
//查找要修改的结点
Person *p1,*p2; p1=Worker;
while(p1)
{
if(p1->No==No)
break;
else
{
p2=p1;
p1=p1->next;
}
}
//修改结点
if(p1!=NULL)//若找到结点
{
p1->Output();
cout<<"调整岗位(1-经理2-销售经理3-兼职推销员4-兼职技术人员):"; cin>>Duty;
if(p1->Duty!=Duty) //若岗位发生变动
{
//修改其它数据
cout<<"输入姓名:"; cin>>Name;
if(Duty==3)
{
cout<<"本月销售额:"; cin>>Amount;
}
else if(Duty==4)
{
cout<<"本月工作小时数(0-168):";
cin>>T;
}
//创建新员工结点
Person *p3;
switch(Duty)
{
case 1:p3=new Manager(p1->No,Name,Duty); break;
case 2:p3=new SalesManager(p1->No,Name,Duty); break;
case 3:p3=new Sales(p1->No,Name,Duty,Amount); break;
case 4:p3=new Technician(p1->No,Name,Duty,T); break;
}
//员工结点替换到链表
p3->next=p1->next;
if(p1==Worker) //若要替换的结点是第一个结点
Worker=p3;
else //若要删除的结点是后续结点
p2->next=p3;
//删除原来的员工结点
delete p1;
}
else //若岗位没有变动
{
cout<<"输入姓名:"; cin>>p1->Name;
if(Duty==3)
{
cout<<"本月销售额:";cin>>Amount; ((Sales *)p1)->SetAmount(Amount);
}
else if(Duty==4)
{
cout<<"本月工作小时数(0-168):";cin>>T; ((Technician *)p1)->SetT(T);
}
}
cout<<"修改成功!\n";
}
else //未找到结点
cout<<"未找到!\n";
}
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.05-sum2<<endl;
cout<<"(按照5%利润计算)\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";
cout<<"\n*** /////公司人员信息管理系统/////***\n";
cout<<"*1-基础数据设置\n";
cout<<"*2-增加人员\n";
cout<<"*3-修改人员\n";
cout<<"*4-删除人员\n";
cout<<"*5-查询本月经营情况\n";
cout<<"*6-数据载入\n";
cout<<"*7-数据存储\n";
cout<<"*8-退出\t请选择(1-8):";
cin>>c;
switch(c)
{
case '1': a.Set(); break;
case '2': a.Add();break;
case '3': a.Modify();break;
case '4': a.Delete(); break;
case '5': a.Query(); break;
case '6': a.Load(); break;
case '7': a.Save(); break;
}
}while(c!='8');
}
一、设计思路
使用面向对象的程序设计思想进行分析,整个系统涉及两大类信息和操作,公司,人员。所以系统主要涉及两个大类:公司类Company、人员类Person。系统的总体框架就是公司类,人员类的定义;主函数中定义一个公司对象,循环显示主菜单并根据用户选择调用公司类的相应方法(成员函数)。
公司类Company:考虑系统操作的人员信息的数量具有不确定性,所以考虑使用链表保存、处理人员信息。公司类包含:所有人员信息的一个不带头结点的链表(作为数据成员)及可以对人员信息进行增,删,改,查询经营信息,基础数据设置,数据存盘,数据装入等操作的相关模块(Set,Add,Modify,Delete,Query,Load,Save)作为成员函数。
人员类Person:所有人员都具有的公共信息及操作可以使用人员类进行描述。由于系统具有4类人员且4类人员数据,操作有所不同,如销售员包含销售额,而技术人员包含工作小时数且计算工资的方法不同,所以应当为4类人员创建相应的Person类的派生类。
为了使公司类可以方便处理人员信息,可以考虑将公司类确定为人员类的友元类或者人员类提供公共的方法以便公司类进行操作。为了公司类可以用共同方法操作人员类,可以将人员类的方法确定为虚函数。
二、设计说明与调试分析
类的层次图
Person
{ No,Name,Duty,Earning,next,Person(),CalcSalary(),Output()}
Manager Sales SalesManager Technician
{ Manager(), {Amount, {Amount, { t,
CalcSalary(), Sales(),GetAmount(), SalesManager(), Technician(),
Output()} SetAmount(), SetAmount(), GetT(),SetT(),
CalcSalary(), CalcSalary(), CalcSalary(),
Output()} Output()} Output()}
Person 类的No-人员编号,Name-人员姓名,Duty-人员类别,Earning-工资,next-指向下一个人员的指针;Person 类的CalcSalary(),Output()定义为纯虚函数分别表示要计算人员工资和输出人员信息,由于定义纯虚函数,所以Person是抽象类,具体计算工资,输出人员信息由派生类完成。
各个派生的类,包含本类对象特有的数据,Sales::Amount-销售员销售额,SalesManager::Amount-销售经理的总销售额(系统统计各个销售员销售额得到销售经理的总销售额),Technician::t-技术人员工作小时数。
Company
{Person *Worker,
Set(),Add(),Modify(),Delete(),Query(),Load(),Save() }
其中:
(1)Worker就是人员链表。
(2)Clear()用于清除人员链表所有结点。
(3)Set(),Add(),Modify(),Delete(),Query(),Load(),Save()分别表示系统各个功能模块: 基础数据设置,增加人员,修改人员,删除人员,查询本月经营信息,数据载入,数据存储。
四、测试结果
人员和基础数据已经装入...
* * * * * * * * * * * * * * * * * * * * * * *
*** /////公司人员信息管理系统/////***
*1-基础数据设置
*2-增加人员
*3-修改人员
*4-删除人员
*5-查询本月经营情况
*6-数据载入
*7-数据存储
*8-退出 请选择(1-8):1 (输入1)
** 设置基础数据 **
经理固定月薪[0元]:8000 (输入8000)
销售经理固定月薪[0元]:5000 (输入5000)
销售经理提成[0%]:5 (输入5)
兼职推销员提成[0%]:4 (输入4)
兼职技术人员小时工资[0(元/小时)]:100 (输入100)
员工标识[>=0]:1 (输入 1)
* * * * * * * * * * * * * * * * * * * * * * *
*** /////公司人员信息管理系统/////***
*1-基础数据设置
*2-增加人员
*3-修改人员
*4-删除人员
*5-查询本月经营情况
*6-数据载入
*7-数据存储
*8-退出 请选择(1-8):2 ( 输入2)
** 新增员工 **
输入岗位(1-经理2-销售经理3-兼职推销员4-兼职技术人):2 ( 输入2)
输入姓名:cx ( 输入姓名 cx)
* * * * * * * * * * * * * * * * * * * * * * *
*** /////公司人员信息管理系统/////***
*1-基础数据设置
*2-增加人员
*3-修改人员
*4-删除人员
*5-查询本月经营情况
*6-数据载入
*7-数据存储
*8-退出 请选择(1-8):3 ( 输入3)
** 修改员工 **
ID:2 ( 输入2)
2 4 经理 8000
调整岗位(1-经理2-销售经理3-兼职推销员4-兼职技术人):2 ( 输入2)
输入姓名:nn ( 输入姓名 nn)
修改成功!
* * * * * * * * * * * * * * * * * * * * * * *
*** /////公司人员信息管理系统/////***
*1-基础数据设置
*2-增加人员
*3-修改人员
*4-删除人员
*5-查询本月经营情况
*6-数据载入
*7-数据存储
*8-退出 请选择(1-8):4 ( 输入4)
** 删除员工 **
ID:2 ( 输入2)
找到并删除
* * * * * * * * * * * * * * * * * * * * * * *
*** /////公司人员信息管理系统/////***
*1-基础数据设置
*2-增加人员
*3-修改人员
*4-删除人员
*5-查询本月经营情况
*6-数据载入
*7-数据存储
*8-退出 请选择(1-8):5 ( 输入5)
** 查询人员本月销售信息 **
2 cx 经理 8000
本月盈利:-8000
(按照5%利润计算)
* * * * * * * * * * * * * * * * * * * * * * *
*** /////公司人员信息管理系统/////***
*1-基础数据设置
*2-增加人员
*3-修改人员
*4-删除人员
*5-查询本月经营情况
*6-数据载入
*7-数据存储
*8-退出 请选择(1-8):6 ( 输入6)
人员和基础数据已经装入...
* * * * * * * * * * * * * * * * * * * * * * *
*** /////公司人员信息管理系统/////***
*1-基础数据设置
*2-增加人员
*3-修改人员
*4-删除人员
*5-查询本月经营情况
*6-数据载入
*7-数据存储
*8-退出 请选择(1-8):7 (输入7)
保存人员和基础数据,是否继续?[Y/N]:y (输入y)
保存人员和基础数据已经完成...
* * * * * * * * * * * * * * * * * * * * * * *
*** /////公司人员信息管理系统/////***
*1-基础数据设置
*2-增加人员
*3-修改人员
*4-删除人员
*5-查询本月经营情况
*6-数据载入
*7-数据存储
*8-退出 请选择(1-8):8 (输入8)
退出
五、设计心得
这样可以么
温馨提示:内容为网友见解,仅供参考