//以下程序已经调试通过
//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();
}