C++课程设计公司工资管理系统说明书

更新时间:2023-05-29 15:13:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

g

2 程序的主要功能

2.1添加功能

添加一个职员的基本信息,包括职工类型,姓名等等,

2.2删除功能

能够对一个职员的信息进行删除按员工号进行删除。

2.3显示功能

显示所有职员的主要信息包括员工类型,姓名,工资。

2.4数据设置功能

设置不同员工类型的工资要求。

2.5修改功能

对职员的信息进行修改。

3 程序运行平台

VC++6.0。

4 总体设计

图4.1 系统总体框架图

g

图4.2类的层次结构图

5 程序类的说明

总职工类的声明 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 technician:virtual public Employee { public:

g

technician() {}

virtual void shanchu() {*name=*sex=0;number=age=hour=0;pay1=0;} void wage() { pay1=100*hour;} virtual void print() { }

void input() { } protected: int hour,pay1; };

经理类的声明

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; }

};

wage();

cout<<"技术员员工号:"<<number<<" "

<<"姓名:"<<name<<" " <<"性别:"<<sex<<" " <<"年龄:"<<age<<" " <<"工资:"<<pay1<<endl;

Employee::input();

cout<<"工作时间(以小时计算)"<<endl; cin>>hour;

g

销售员类的声明

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 SalesManager:public Person //销售经理类 { private: double Amount;

g

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 Company //公司类 { private:

Person *Worker; //员工表 void Clear(); //清除内存中数据 public: Company() {

Worker=0; Load(); }

~Company() {

Person *p; p=Worker; while(p)

g

{

p=p->next; delete Worker; Worker=p; }

Worker=0; }

void Add(); //增加人员 void Delete(); //删除人员 void Modify(); //修改人员 void Query(); //查询人员 void Set(); //基础数据设置

void Save(); //数据存盘(包括基础数据,人员数据) void Load(); //数据装入(包括基础数据,人员数据) };

6 模块分析

6.1 添加模块

添加函数如下:

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;

g

if(Duty==3) {

cout<<"本月销售额:"; cin>>Amount; }

else if(Duty==4) {

cout<<"本月工作小时数(0-168):"; cin>>T; }

6.2 查询本月经营模块

显示函数如下: 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;

g

p=p->next; }

cout<<"本月盈利:"<<sum*0.20-sum2<<endl; cout<<"(按照20%利润计算)\n"; } 6.3 修改模块

修改函数如下: 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; } }

g

//修改结点

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; }

//员工结点替换到链表

g

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; *)p1)->SetAmount(Amount);

}

else if(Duty==4) {

cout<<"本月工作小时数(0-168):"; cin>>T; *)p1)->SetT(T);

} }

cout<<"修改成功!\n"; }

else //未找到结点 cout<<"未找到!\n"; }

6.4 数据装盘模块

数据装盘函数如下: void Company::Save()

((Sales

((Technician

g

{

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();

g

cout<<"\n保存人员和基础数据已经完成...\n"; } 6.5 删除模块

删除函数如下:

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;

g

delete p1; }

else //若要删除的结点是后续结点 {

p2->next=p1->next; delete p1; }

cout<<"找到并删除\n"; }

else //未找到结点 cout<<"未找到!\n"; }

6.6 基础数据设置模块 基础数据设置函数如下:

void Company::Set() {

cout<<"\n** 设置基础数据 **\n"; cout<<"经理固cin>>ManagerSalary;

["<<ManagerSalary<<"

]:";

cout<<"销售经理固定月薪["<<SalesManagerSalary<<"元]:"; cin>>SalesManagerSalary; cout<<"销售经理提cin>>SalesManagerPercent; cout<<"销售人员cin>>SalesPercent;

成提

["<<SalesManagerPercent<<"成

["<<SalesPercent<<"

%%

]:";

]:";

cout<<"技术人员小时工资["<<WagePerHour<<"(元/小时)]:"; cin>>WagePerHour;

cout<<"员工标识[>="<<ID<<"]:"; cin>>ID; }

6.7 数据装入模块 数据装入函数:

void Company::Load() //数据装入(包括基础数据,人员数据)

g

{

//基础数据装入 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) {

g

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";

g

}

7 系统测试

进入VC++6.0,运行程序,如图7.1所示。

图7.1

进行基础数据设置,如图7.2所示。

g

增加人员,入图7.3所示。

图7.3

g

查询人员本月销售信息,如图7.4所示。

图7.4

进行修改,如图7.5所示。

图7.5

进行删除,如图7.6所示。

g

图7.6

数据存盘,如图7.7所示。

图7.7

g

8 结论

此次课程设计,让我懂得了更深地了解了C++的各方面的知识,感悟到C++的魅力所在,让我能更熟练地去运用C++的知识,编出让自己满意的程序,获得更大的动力,让我不断进步!

此次课程设计,也暴露了自己很多的不足,许多知识掌握得不熟,模棱两可,不过我去图书馆借阅书籍,通过查询,还是解决了这些问题,巩固了自己。

g

公司工资管理系统

-21-

本文来源:https://www.bwwdw.com/article/4lg4.html

Top