工资管理系统(C++)

//以下程序已经调试通过

//HQ原创

#include <iostream.h>
#include <fstream.h>
#include <string.h>


//----------------------------------------------------------薪水类
class salary
{
public:
salary(){}//构造函数
    ~salary(){}//析构函数
void setm(int);
int   getm();
   void setp(float);//静态函数
   float getp();
void setnext(salary *);
salary *getnext();
private :
     int     month;//月份
     float   pay;//基本工资
     salary *next;//指向下一个
};
void salary::setm(int m){month=m;}
int salary::getm(){return month;}
void salary::setp(float p){pay=p;}
float salary::getp(){return pay;}
void salary::setnext(salary* n){next=n;}
salary* salary::getnext(){return next;}

//----------------------------------------------------------员工类
class employee
{
public:
    employee(){}//构造函数
    ~employee(){}//析构函数
void setnu(char *);
char* getnu();
void setna(char *);
char* getna();
void setc(char);
char getc();
void setn(int);
int   getn();
void seth(salary *);
salary *geth();
void setl(salary *);
salary *getl();
void setnext(employee *);
employee *getnext();
private:
    char    num[10];//工号
    char    name[20];//姓名
    char    career;//职务不同,工资不同
int     n;//已发放次数
    salary *head;//工资首指针
    salary *last;//工资{zh1}指针
    employee *next;//指向下一个
};
void employee::setnu(char *n){strcpy(num,n);}
char * employee::getnu(){return num;}

void employee::setna(char *n){strcpy(name,n);}
char * employee::getna(){return name;}

void employee::setc(char cc){ career=cc;}
char   employee::getc(){return career;}

void employee::seth(salary* h){head=h;}
salary* employee::geth(){return head;}

void employee::setn(int n){this->n=n;}
int employee::getn(){return n;}

void employee::setl(salary* l){last=l;}
salary* employee::getl(){return last;}

void employee::setnext(employee* n){next=n;}
employee* employee::getnext(){return next;}

//------------------------------------------------------------管理类
class manage
{
public:
manage(){}
~manage(){}
void ini();//初始化
void adde();//新建员工
void adds();//新建工资
    void modify();//修改员工
    void del();//删除员工
void show();//显示信息
void query();//查询工资
void save();//保存
void run();
private:
employee *head;
employee *last;
};


void manage::ini()
{
head=last=NULL;//初始化为空。
ifstream rf("employee.txt",ios::out|ios::nocreate,filebuf::openprot);
    if(rf.fail())cout<<"\n\n提示,文件不存在!";
else
{
int n;
   rf.read((char *)&n,sizeof(n));//读出文件个数(在存储时已经存入)

for(int i=0;i<n;i++)
{ employee *p;
     p=new employee;
   rf.read((char *)p,sizeof(employee));
   p->setnext(NULL);
   if(head==NULL)head=last=p;
   else {last->setnext(p);last=p;}
     
   //以下取出工资存入链表-----------------------
   p->seth(NULL);p->setl(NULL);
   if(p->getn()>0)//证明有工资发放记录
   {
            salary *q;
    for(int j=0;j<p->getn();j++)
    {
       q=new salary;
    rf.read((char *)q,sizeof(salary));
    q->setnext(NULL);
    if(p->geth()==NULL){p->seth(q);p->setl(q);}
    else {p->getl()->setnext(q);p->setl(q);}
    }
   }
    
   //--------------------------------------------
     //cout<<"\n\n初始化"<<p->getna()<<"员工"<<p->getn()<<"个工资信息成功!";
}
//cout<<"\n\n初始化"<<n<<"个员工成功!";
}

   rf.close();
}

void manage::adde()
{
loop:
cout<<"\n\n\n\n █增 加 员 工█ :";

employee *p=new employee;
loop1:
cout<<" \n\n\n    工号: ";
char c[20];
cin>>c;
//---------------------------------
employee *pj=head;
while(pj)//检验是否与以前的工号重复
{
if(strcmp(pj->getnu(),c)==0)
{cout<<"工号重复,请重新输入!\n";goto loop1;}
pj=pj->getnext();
}
p->setnu(c);
cout<<" \n    姓名: ";
cin>>c;
p->setna(c);
loop2:
cout<<" \n    职务:(填 m代表manager 、e:代表employee 、c:代表cleaner)";
char cc;
cin>>cc;
if(cc!='m'&&cc!='e'&&cc!='c')
{ cout<<"错误,请重新输入职务!";goto loop2;}//不允许输错
p->setc(cc);

p->setnext(NULL);
p->seth(NULL);//没有任何一个月的工资记录
p->setl(NULL);
p->setn(0);//没有结算
if(head==NULL) head=last=p;
else   {last->setnext(p);last=p;}//last总是链表中的{zh1}一个

cout<<"\n恭喜,操作成功!\n";
cout<<"\n\n\n|-------------------------|";
cout<<"\n|您想继续新建员工档案吗? |\n|    是(Y)        否(N)   |";
cout<<"\n|-------------------------|\n";         
cin>>cc;
if(cc=='Y'||cc=='y') goto loop;
}


void manage::adds()
{
loop:
cout<<"\n\n\n\n █工 资 结 算█  ";
int y=1;
char n[20];
cout<<"\n\n请输入要查找的工号\n\n";
cin>>n;
employee *p=head;  

while(p)
{
     if(strcmp(p->getnu(),n)==0)
{ y=0;
cout<<" \n \n 请核对信息:";
cout<<"\n|-------------------------------------------------------------|";
cout<<" \n    工号:"<<p->getnu()<<" \t          姓名:"<<p->getna();
cout<<" \n    职务:";
if(p->getc()=='m') cout<<" 经理";
if(p->getc()=='e') cout<<" 员工";
if(p->getc()=='c') cout<<" 清洁人员";

if(p->getn()<=0)cout<<"           工资结算: 无工资结算记录";
else
{
cout<<"           工资结算: "<<"已结算"<<p->getn()<<"个月工资";
cout<<"\n|-------------------------------------------------------------|";
salary *q=p->geth();
      while(q)
   {cout<<"\n   ["<<q->getm()<<"] 月份工资已经结算:"<<q->getp()<<" 元";q=q->getnext();}
}
cout<<"\n|-------------------------------------------------------------|\n";
     cout<<"\n\n\n个人信息是否有误?\n重新输入(n),退出(q),继续(y)\n";//如果是就往下,否则重新输入
     char cc;
     cin>>cc;
      if(cc=='n')goto loop;
      if(cc=='q'){cout<<"\n\n\n员工工资核算失败!";goto end; }
   //--------------------------------------------------------------------------------
       loop1:
       cout<<" \n请输入月份:";
      int mm;
   cin>>mm;
   //检查------------------------------------------------------------------------------------------
     if(p->getn()>0)//有记录
{ salary *qq=p->geth();
     while(qq)
   {
  
   if(qq->getm()==mm)
   {cout<<"\n错误,该月份已经结算!\n重新输入(n),退出(q)\n";
   char ccc;
   cin>>ccc;
   if(ccc=='n')goto loop1;
        if(ccc=='q'){cout<<"\n\n\n员工工资核算失败!";goto end;}
   }

        qq=qq->getnext();
   }
}
   if(mm>12||mm<1)
   { cout<<"\n错误,请重新输入月份!\n";goto loop1;}
   //---------------------------------------------------------------------------------------------
//开辟salary的开空间
         salary   *p1;
         p1=new salary;//开辟salary的开空间
         p1->setnext(NULL);
         p1->setm(mm);
   
        cout<<"\n该员工的基本工资为: ";
   if(p->getc()=='m') {cout<<" 3000";p1->setp(3000);}
        if(p->getc()=='e') {cout<<" 1500";p1->setp(1000);}
        if(p->getc()=='c') {cout<<"   800 ";p1->setp(800);}
//连到表上     
   if(p->geth()==NULL){p->seth(p1);p->setl(p1);}
        else {p->getl()->setnext(p1);p->setl(p1);}
   p->setn(p->getn()+1);//记录加一
       cout<<" \n员工 "<<p->getna()<<"   "<<p1->getm()<<" 月份工资信息核算完毕!";
}//if的回括号

        p=p->getnext();
}
if(y)cout<<"\n\n失败,您要查找的工号不存在!\n\n";
else cout<<"\n恭喜,操作成功!\n";
end:
char c;
cout<<"\n\n\n|-------------------------|";
cout<<"\n|您想继续结算吗? |\n|    是(Y)        否(N)   |";
cout<<"\n|-------------------------|\n";         
cin>>c;
if(c=='Y'||c=='y') goto loop;

}

void manage::modify()
{
loop1:
cout<<"\n\n\n\n █修 改 员 工█ :";
int y=1;
char n[20];
cout<<"\n\n请输入要修改的工号\n\n";
cin>>n;
employee *p=head;  

while(p)//{dy}个while
{
     if(strcmp(p->getnu(),n)==0)//{dy}个if
{ y=0;
cout<<" \n请修改姓名: ";
cin>>n;
p->setna(n);

loop2:
cout<<" \n请修改职务:(填 m代表manager 、e:代表employee 、c:代表cleaner)";
char cc;
cin>>cc;
if(cc!='m'&&cc!='e'&&cc!='c')
{ cout<<"错误,请重新输入职务!";goto loop2;}//不允许输错
p->setc(cc);
//----------------------------------------------------
salary *p1=p->geth();//修改工资
while(p1)
{       if(cc=='m') p1->setp(3000);
        else if(cc=='e') p1->setp(1000);
        else p1->setp(800);
   p1=p1->getnext();
}
//------------------------------------------------------
}//{dy}个if
p=p->getnext();

}
if(y)cout<<"错误,无该员工!";
else cout<<"\n恭喜,操作成功!\n";

char c;
cout<<"\n\n\n|-------------------------|";
cout<<"\n|您想继续修改吗? |\n|    是(Y)        否(N)   |";
cout<<"\n|-------------------------|\n";         
cin>>c;
if(c=='Y'||c=='y') goto loop1;
}

void manage::del()
{
loop:
if(head==NULL)cout<<"\n\n提示,无员工信息记录!";
else
{  
cout<<"\n              [删除菜单]";
cout<<"\n|--------------------------------|";
cout<<"\n|    请选择删除方式:             |";
cout<<"\n|--------------------------------|";
cout<<"\n|          A[ 删除工资信息 ]     |";
cout<<"\n|--------------------------------|";
cout<<"\n|          B[ 删除员工信息 ]     |";   
cout<<"\n|--------------------------------|";
cout<<"\n|          C[ 清空所有数据 ]     |";
cout<<"\n|--------------------------------|";   
cout<<"\n|          D [   退出   ]       |";
cout<<"\n|--------------------------------|";
char c;
cin>>c;


if(c=='A'||c=='a')//-----------------------------------------------------------------------------------
{
if(head==NULL)goto loop;
loop1:
cout<<"\n\n\n\n    █删除工资信息█ :";
int y=1;
char n[20];
cout<<"\n\n请输入要删除的工号\n\n";
cin>>n;
employee *p=head;  


while(p)
{
if(strcmp(p->getnu(),n)==0) { y=0;break;}
    p=p->getnext();
}

if(y) cout<<"\n错误,无该员工!";
else{
if(p->getn()<=0)cout<<"\n\n错误,无工资记录!";
else//有工资记录
{
cout<<"\n       [工资删除菜单]";
cout<<"\n|-----------------------------|";
cout<<"\n|    请选择工资删除方式:      |";
cout<<"\n|-----------------------------|";
cout<<"\n|      A[ 删除单个月份]       |";
cout<<"\n|-----------------------------|";
cout<<"\n|      B[ 删除所有月份 ]      |";   
cout<<"\n|-----------------------------|";
cout<<"\n|      C[    退出     ]       |";
cout<<"\n|-----------------------------|";   

char c;
cin>>c;

loop6:
if(c=='A'||c=='a')//-----------------
{
cout<<"\n\n请输入要删除的月份:";
int mm;
cin>>mm;

int y1=1;
salary *temp,*q=p->geth();
if(p->geth()->getm()==mm){temp=p->geth();p->seth(temp->getnext());y1=0;}//如果是{dy}个
else while(q->getnext())
{
if(q->getnext()->getm()==mm){temp=q->getnext();q->setnext(q->getnext()->getnext());y1=0;break;}
    q=q->getnext();
}


if(y1)cout<<"\n错误,无该月份工资记录!";
else
{delete temp;
p->setn(p->getn()-1);//记录少一
cout<<"\n恭喜,操作成功!\n"; }


cout<<"\n\n\n|-------------------------|";
cout<<"\n|您想继续删除吗? |\n|    是(Y)        否(N)   |";
cout<<"\n|-------------------------|\n";         
cin>>c;
if(c=='Y'||c=='y') goto loop1;
}


if(c=='B'||c=='b')//-------------------
{
salary *t,*q;
t=q=p->geth();
int i=0;
while(q)
{
i++;
cout<<"\nxx"<<p->getna()<<"第"<<i<<"条工资信息";
t=q->getnext();
delete q;
q=t;
}
p->setn(0);//工资记录置0
p->seth(NULL);
}

if(c=='C'||c=='c')goto loop;//------------------

cout<<"\n\n\n|-------------------------|";
cout<<"\n|您想继续删除吗? |\n|    是(Y)        否(N)   |";
cout<<"\n|-------------------------|\n";         
cin>>c;
if(c=='Y'||c=='y') goto loop;
}
}

}

if(c=='B'||c=='b')//-----------------------------------------------------------------------------------------
{
if(head==NULL)goto loop;

cout<<"\n\n\n\n    █删除员工信息█  ";
int y=1;
char n[20];
cout<<"\n\n请输入要删除的工号\n\n";
cin>>n;
employee *temp,*p=head;  
if(strcmp(head->getnu(),n)==0){temp=head; head=head->getnext();y=0;}//{dy}个就是
else
while(p->getnext())
{
if(strcmp(p->getnext()->getnu(),n)==0) { y=0;temp=p->getnext();p->setnext(p->getnext()->getnext());break;}
    p=p->getnext();
}


if(y)cout<<"\n错误,无该员工!";
else {cout<<"\n恭喜,操作成功!\n";
if(temp->getn()>0)//xx工资记录
{
salary *t,*q;
t=q=temp->geth();
int i=0;
while(q)
{
i++;

cout<<"\nxx"<<temp->getna()<<"第"<<i<<"条工资信息";
t=q->getnext();
delete q;
q=t;
}

}
}

cout<<"\n\n\n|-------------------------|";
cout<<"\n|您想继续删除吗? |\n|    是(Y)        否(N)   |";
cout<<"\n|-------------------------|\n";         
cin>>c;
if(c=='Y'||c=='y') goto loop;
}

if(c=='c'||c=='C')//-----------------------------------------------------------------------------------------
{
if(head==NULL)goto loop;
cout<<"\n\n\n\n    █清空信息█  ";

employee *p=head;
while(p)
{
cout<<"\nxx"<<p->getna()<<"信息";
employee *temp=p->getnext();

if(p->getn()>0)//xx工资记录
{
salary *t,*q;
t=q=p->geth();
int i=0;
while(q)
{
i++;
cout<<"\nxx"<<p->getna()<<"第"<<i<<"条工资信息";
t=q->getnext();
delete q;
q=t;
}
p->seth(NULL);
p->setn(0);
}


delete p;
p=temp;
}

head=last=NULL;
}


}

}


void manage::show()
{
employee *p=head;
if(p==NULL)cout<<"\n\n\n员工基本信息为空,请新建! \n\n      ";
else{

cout<<"\n\n\n\n            █员工基本信息数据库█          ";
cout<<"\n|-------------------------------------------------------------|";

while(p)
{

cout<<" \n    工号:"<<p->getnu()<<" \t          姓名:"<<p->getna();
cout<<" \n    职务:";
if(p->getc()=='m') cout<<" 经理";
if(p->getc()=='e') cout<<" 员工";
if(p->getc()=='c') cout<<" 清洁人员";

cout<<"           工资结算: "<<"已结算"<<p->getn()<<"个月工资";
cout<<"\n|-------------------------------------------------------------|\n";

p=p->getnext();
}
}
}

void manage::query()
{
loop:
int y=1;
char n[20];
cout<<"\n\n请输入要查找的工号\n\n";
cin>>n;
employee *p=head;  

while(p)
{
     if(strcmp(p->getnu(),n)==0)
{y=0;
cout<<"\n|-------------------------------------------------------------|";
cout<<" \n    工号:"<<p->getnu()<<" \t          姓名:"<<p->getna();
cout<<" \n    职务:";
if(p->getc()=='m') cout<<" 经理";
if(p->getc()=='e') cout<<" 员工";
if(p->getc()=='c') cout<<" 清洁人员";
if(p->getn()<=0)cout<<"           工资结算: 无工资结算记录";
else
{
cout<<"\n|-------------------------------------------------------------|";
salary *q=p->geth();
      while(q)
   {cout<<"\n   ["<<q->getm()<<"] 月份工资已经结算:"<<q->getp()<<" 元";q=q->getnext();}
}

cout<<"\n|-------------------------------------------------------------|\n";

}//if的回括号
p=p->getnext();
}

if(y)cout<<"\n\n失败,您要查找的工号不存在!\n\n";
else cout<<"\n恭喜,操作成功!\n";

char c;
cout<<"\n\n\n|-------------------------|";
cout<<"\n|您想继续查询吗? |\n|    是(Y)        否(N)   |";
cout<<"\n|-------------------------|\n";         
cin>>c;
if(c=='Y'||c=='y') goto loop;
}


void manage::save()
{
ofstream wf("employee.txt",ios::in,filebuf::openprot);
    employee *p=head;
int n=0;
while(p){++n; p=p->getnext();}//员工的总个数
    wf.write((char *)&n,sizeof(n));
p=head;//置回开头。
    while(p)
{
wf.write((char*)p,sizeof(employee));

//-------------------------写入工资信息
if(p->getn()>0)
{
salary *q=p->geth();
     while(q)
{
wf.write((char*)q,sizeof(salary));
q=q->getnext();
}
   
}
//cout<<"\n\n保存"<<p->getna()<<"员工"<<p->getn()<<"个工资信息成功!";
p=p->getnext();
}
//cout<<"\n\n保存"<<n<<"个员工成功!";
wf.close();
}


void manage::run()
{

ini();
cout<<"\n\n              ★ 欢迎使用!★";
char c1;
do {
cout<<"\n\n\n |----------------------------------------|";
cout<<"\n |      █ 主        菜       单█        |";             
cout<<"\n |----------------------------------------|";
cout<<"\n |          A 新   建   员   工          |";
cout<<"\n |----------------------------------------|";
cout<<"\n |          B 信   息   显   示          |";
cout<<"\n |----------------------------------------|";
cout<<"\n |          C 工   资   查   询          |";
cout<<"\n |----------------------------------------|";
cout<<"\n |          D 工   资   核   算          |";
cout<<"\n |----------------------------------------|";
cout<<"\n |          E 管   理   维   护          |";
cout<<"\n |----------------------------------------|";
cout<<"\n |          F 退   出   程   序          |";             
cout<<"\n |----------------------------------------|";
cout<<"\n |             请您选择一个任务           |";
cout<<"\n |----------------------------------------|\n\n\n";
cin>>c1;
switch ( c1 )
{

case 'a':
case 'A':adde();break;

case 'b':
case 'B':show();break;

case 'c':
case 'C':query();break;


case 'd':
case 'D':adds();break;

case 'E':
case 'e':
  
{
   char c2;

do{
cout<<"\n\n\n\n |-----------------------------|";
cout<<"\n |    █管 理 菜   单█      |";             
cout<<"\n |-----------------------------|";
cout<<"\n | A   删 除 员 工         |";
cout<<"\n |-----------------------------|";
cout<<"\n | B   修 改 员 工         |";
cout<<"\n |-----------------------------|";
cout<<"\n | C   退 出 程 序         |";
cout<<"\n |-----------------------------|";
cout<<"\n |     请您选择一个任务        |";
cout<<"\n |-----------------------------|\n\n\n";
cin>>c2;
switch ( c2)

{
case 'a':
case 'A':del();break;

case 'b':
case 'B':modify();break;

   }

}while(c2!='c'&&c2!='C');

}break;

}

}while(c1!='F'&&c1!='f');

save();
cout<<"\n\n ★ 谢谢您的使用!★";

}
//-----------------------------------------------------------------------------------------------


void main()
{
manage m;
m.run();
}




郑重声明:资讯 【工资管理系统(C++)】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——