
#include #include #include #include #include using namespace std; #define NULL 0 #define LEN sizeof(struct student) int const N=20; void Menu(); void Pass(); i定义一个全局变量统计职工人数 //——--------->定义一个职工信息的结构体 struct student { char name[N]; //用来存放姓名 char sex[N]; //用来存放性别 long id; //用来存放编号 float paid[3]; //用来存放工资 int total; //用来存放总工资 struct student *next; }; //-------------->职工类 class Information { public: I构造函数. ~析构函数. s建立链表 v显示职工信息 i定义函数count()统计职工总数 student *insert(student*head); //指针函数*insert()用来添加职工信息. student *cancel(student *head,long id); //指针函数*cancel()用来删除职工信息. student *find(student *head,long id); //指针函数*find()用来查找职工信息. student *modify(student *head,long id); //指针函数*modife()用来修改职工的信息. void paixu(student *head); //定义paixu()函数将职工的总额从大到小排列并输出 v定义职工工资平均值的函数 void save(student *head); //保存文件信息 student *Read(); //读取文件信息 private: student *p1,*p2,*p3,*head,st; }; Information::Information() {cout<<" ******************************************************************************\\n"; cout<<" ------------------------<<欢迎您使用员工工资管理系统>>------------------------\\n"; cout<<" ******************************************************************************\\n\\n"; } Information::~Information() { cout<<" ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤\\n"; cout<<" \\n"; cout<<" 本系统管理员 \\n"; cout<<" \\n"; cout<<" \\n"; cout<<" ------------------------<<谢谢您使用员工工资管理系统>>------------------------\\n"; cout<<" \\n"; cout<<" \\n"; cout<<" 欢迎下次使用 \\n"; cout<<" \\n"; cout<<" \\n"; cout<<" 再见 \\n"; cout<<" \\n"; cout<<" ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤\\n"; } //------------>建立链表信息 student *Information::creat(void) {//定义一个指向struct student的结构体指针函数*creat()用来录入职工信息. c用来存放职工姓名 p1=p2=(student *)malloc(LEN);//调用malloc()函数用来开辟一个新的存储单元 cout<<" -------------<<请建立员工信息表,在姓名处键以 # 结束输入!>>--------------"< cin>>ch; h给指针head赋初值 while (strcmp(ch,"#")!=0) {调用字符比较函数strcmp()用来判断是否继续输入 p调用malloc()函数用来开辟一个新的存储单元 s将循环结构前面输入的姓名复制到结构体名为p1的数组name中 cout<<" 性别:"; cin>>p1->sex; cout<<" 编号:"; cin>>p1->id; w判断输入的编号是否有效(100000个) { cout<<" 对不起您的输入错误!请重新输入(>0<1000000): "; cin>>p1->id; } cout<<" 基本工资:"; cin>>p1->paid[0]; w判断输入的分数是否有效(>=0 <=100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->paid[0]; } cout<<" 加班工资:"; cin>>p1->paid[1]; w判断输入的分数是否有效(>=0 <=100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->paid[1]; } cout<<" 其他奖金:"; cin>>p1->paid[2]; w判断输入的分数是否有效(>=0 <=100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->paid[2]; } p计算总额 i如果是输入第一组职工信息就将指针p1赋给指针head e否则将p1赋给p2所指结构体的next指针 p将指针p1赋给指针p2 n将职工人数n的值加1 cout<<"\\n 姓名:"; c将输入的姓名存放到字符数组ch中 } p2->next=NULL; //将p2所指结构体的next指针重新赋空值 return (head);//将输入的第一组职工信息返回 } //--------------->定义output()函数将职工的信息从头指针所指内容开始输出 void Information::output(student *head) { system("cls"); if(head==NULL) cout<<" 这是一个空表,请先输入员工信息!\\n"; else{ cout<<"-------------------------------------------------------------------------------\\n"; cout<<" *职工工资信息表*\\n"; cout<<"-------------------------------------------------------------------------------\\n"; cout<<"|编 号|姓 名|性别|基本工资|加班工资| |其他奖金|总额|\\n"; cout<<"-------------------------------------------------------------------------------\\n"; p将头指针赋给p do { cout< < < < < < < p将下一组职工信息的next指针赋给p }若指针p非空则继续,目的是把所有的职工信息都传给指针p然后输出. } } //------------>统计职工人数的函数 i定义函数count()统计职工总数 { i若指针head为空返回值为0 e函数的递归调用 } //----------->添加职工的成绩的函数 student *Information::insert( student *head) //插入新结点定义一个指向struct student的结构体指针函数*insert()用来添加职工信息. { system("cls"); cout<<"\----------------<<请输入新增员工信息>>----------------\\n"< cout<<" 编号:"; cin>>p1->id; while((p1->id)<0||(p1->id)>100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->id; //将输入的编号存放到p1所指结构体的数组id中 } cout<<" 姓名:"; cin>>p1->name; //将输入的姓名存放到结构体名为p1的数组name中 cout<<" 性别:"; cin>>p1->sex; cout<<" 基本工资:"; cin>>p1->paid[0]; while((p1->paid[0])<0||(p1->paid[0])>100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->paid[0]; //将输入的基本工资存放到p1所指结构体的数组paid中 } cout<<" 加班工资:"; cin>>p1->paid[1]; while((p1->paid[1])<0||(p1->paid[1])>100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->paid[1]; //将输入的加班工资存放到p1所指结构体的数组paid中 } cout<<" 其他奖金:"; cin>>p1->paid[2]; while((p1->paid[2])<0||(p1->paid[2])>100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->paid[2]; //将输入的其他奖金存放到p1所指结构体的数组paid中 } p1->total=p1->paid[0]+p1->paid[1]+p1->paid[2];//计算总分 p2=head; //将头指针赋给p2 if(head==NULL) //若没调用次函数以前的头指针head为空 { head=p1;p1->next=NULL; } //则将p1赋给头指针head并将p1所指结构体成员指针next赋空值 else { while((p1->id>p2->id)&&(p2->next!=NULL)) { p3=p2; //p3指向原p2指向的结点 p2=p2->next; } //p2后移一个结点 if(p1->id<=p2->id) { if(head==p2) { p1->next=head; head=p1; } //插入到第一个结点之前 else { p3->next=p1; p1->next=p2; } //插入到p3所指结点之后 } else { p2->next=p1; p1->next=NULL; } //插入到尾结点之后 } n++; //将职工人数加1 cout<<"\----------------<<你输入的员工信息已经成功插入>>----------------"< } //------------>删除职工信息 student *Information::cancel(student *head,long id) //定义一个指向struct student的结构体指针函数*delete()用来删除考生信息. { system("cls"); if(head==NULL) //若调用次函数以前的头指针head为空 { return(head); } else { p1=head; //否则将头指针赋给p1 while(id!=p1->id&&p1->next!=NULL) //寻找要删除的结点当p1所指的职工编号不是输入的职工编号并且p1所指的next指针不为空 { p2=p1; p1=p1->next; } //p2指向原p1指向的结点p1后移一个结点 if(id==p1->id) //如果输入的职工编号是p1所指的职工编号//结点找到后删除 { if(p1==head) head=p1->next; //如果head指针和p1指针相等则将下一个结点赋给指针head else p2->next=p1->next; //否则将p1所指结点赋给p2所指结点将要删除的职工信息跳过去 cout<<" 删除编号为"< } return(head); //将头指针返回 } } /**************************修改职工数据**************************/ student *Information::modify(student *head,long id) { system("cls"); cout<<"\----------------<<请输入须修改的员工工资信息>>----------------\\n"< p1=head; //否则将头指针赋给p1 while(id!=p1->id&&p1->next!=NULL) //寻找结点当p1所指的职工编号不是输入的职工编号并且p1所指的next指针不为空 { p1=p1->next; //p2指向原p1指向的结点p1后移一个结点 } if(id==p1->id) //如果要查找的职工编号是p1所指的职工编号 { cout<<"你需要修改的员工信息如下:\\n"; cout<<"------------------------------------------------------------------------------\\n"; cout<<"|编 号| |姓 名| |性别| |基本工资| |加班工资| |其他奖金| |总额|\\n"; cout<<"------------------------------------------------------------------------------\\n"; cout< < < < < < < cout<<" 编号:"; cin>>p1->id; while((p1->id)<0||(p1->id)>100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->id; //将输入的编号存放到p1所指结构体的数组id中 } cout<<" 姓名:"; cin>>p1->name; //将输入的姓名存放到结构体名为p1的数组name中 cout<<" 性别:"; cin>>p1->sex; cout<<" 基本工资:"; cin>>p1->paid[0]; while((p1->paid[0])<0||(p1->paid[0])>100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->paid[0]; //将输入的基本工资存放到p1所指结构体的数组paid中 } cout<<" 加班工资:"; cin>>p1->paid[1]; while((p1->paid[1])<0||(p1->paid[1])>100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->paid[1]; //将输入的加班工资存放到p1所指结构体的数组paid中 } cout<<" 其他奖金:"; cin>>p1->paid[2]; while((p1->paid[2])<0||(p1->paid[2])>100000) { cout<<" 对不起您的输入错误!请重新输入(>0<100000): "; cin>>p1->paid[2]; //将输入的其他奖金存放到p1所指结构体的数组paid中 } p1->total=p1->paid[0]+p1->paid[1]+p1->paid[2]; //计算总分 } else cout<<" 需要修改的信息中没有编号为"< return(head); } //------------>查找职工信息 student *Information::find(student *head,long id) //定义一个指向struct student的结构体指针函数*find()用来查找职工信息. { system("cls"); if(head==NULL) //若调用次函数以前的头指针head为空 { cout<<" 这是一个空表,请先输入员工信息!\\n"; return(head); } else { p1=head; //否则将头指针赋给p1 while(id!=p1->id&&p1->next!=NULL) //寻找结点当p1所指的职工编号不是输入的职工编号并且p1所指的next指针不为空 { p1=p1->next; //p2指向原p1指向的结点p1后移一个结点 } if(id==p1->id) //如果要查找的职工编号是p1所指的职工编号 { cout<<"------------------------------------------------------------------------------\\n"; cout<<"|编 号| |姓 名| |性别| |基本工资| |加班工资| |其他奖金| |总额|\\n"; cout<<"------------------------------------------------------------------------------\\n"; cout< < < < < < < } else cout<<"信息中没有编号为"< } } //------------定义paixu()函数将职工的工资总额从大到小排列并输出 void Information::paixu(student *head) { system("cls"); int i,k,m=0,j; student *p[N];//定义一个指向struct student的结构体指针数组p if(head!=NULL)//如果头指针是空则继续 { m=count(head); cout<<"------------------------------------------------------------------------------\\n"; cout<<" *员工工资统计表*\\n"; cout<<"------------------------------------------------------------------------------\\n"; cout<<"|编号| |姓名| |性别| |基本工资| |加班工资| |其他奖金| |总额| |名次|\\n"; cout<<"------------------------------------------------------------------------------\\n"; p1=head; for(k=0;k p[k]=p1; p1=p1->next; } for(k=0;k total) { p2=p[k]; p[k]=p[j]; p[j]=p2; } //从大到小排列的指针 for(i=0;i cout< < < < < < < < } } } //------------>求各工资的平均值的函数 void Information::average(student *head) { int k,m; float arg1=0,arg2=0,arg3=0; if(head==NULL)//如果头指针是空则继续 { cout<<" 这是一个空表,请先输入员工信息!\\n"; } else { m=count(head); p1=head; for(k=0;k arg1+=p1->paid[0]; arg2+=p1->paid[1]; arg3+=p1->paid[2]; p1=p1->next; } arg1/=m;arg2/=m;arg3/=m; cout<<" *各项工资的平均值*\\n"; cout<<"------------------------------------------------------------------------------\\n"; cout<<"\\基本工资的平均值: "< } } //------------------->保存函数. void Information::save(student *head) { system("cls"); ofstream out("data.txt",ios::out); out< { out< < < < < < < } } //———————————>读取文件的信息 student *Information::Read() { system("cls"); int i=0; p1=p2=( student *)malloc(LEN); head=NULL; ifstream in("data.txt",ios::in); in>>i; if(i==0){cout<<" data 文件中的数据为空,请先输入数据!"< cout<<"\\n原文件已保存的信息如下:\\n"; cout<<" ………………………………………………………………………………………………"< cout<<" ………………………………………………………………………………………………"< { p1=(student *)malloc(LEN); in>>st.name>>st.id>>st.sex >>st.paid[0]>>st.paid[1]>>st.paid[2]>>st.total; strcpy(p1->name,st.name); p1->id=st.id; strcpy(p1->sex,st.sex); p1->paid[0]=st.paid[0]; p1->paid[1]=st.paid[1]; p1->paid[2]=st.paid[2]; p1->total=st.total; if(n==0)head=p1; //如果是输入第一组职工信息就将指针p1赋给指针head else p2->next=p1; //否则将p1赋给p2所指结构体的next指针 p2=p1; //将指针p1赋给指针p2 n++; //将n的值加1 //显示读入数据 cout<<" "< < << p1->sex <<" \" << p1->paid[0] <<" \" << p1->paid[1] <<" \" << p1->paid[2] <<" \" << p1->total< cout<<" 数据已经成功读取完毕!\\n\\n"< in.close(); return (head); } } //-------------------->菜单 void Menu() { student *head=NULL; ※※※※※※※※※※※※※※※※※※※※※※※※※"< ※ 欢迎进入员工信息统计管理 ※ ※※※※※※※※※※※※※※※※※※※※※※※※※"< 相关操作选项 ※※※※※※※※※※※※※※※※※※※※※※※※※"< 对不起您的输入错误!请输入您的选择(0--9): "; //head=person.Read(); 参加工作的员工人数为:"< 请输入要查找的编号:"; 对不起您的输入错误!请重新输入: "; } case 5: 请输入要删除的编号:"; 对不起您的输入错误!请重新输入: "; } case 7: 请输入要修改的编号:"; 对不起您的输入错误!请重新输入: "; } 信息已经成功保存!"< case 9: 对不起您的输入有误!请重新输入:\\n"; } } } //----------------->管理员登陆 void Pass() { char UserName[30]; char Passward[20]; int i=0; cout<<"****************************************************************************\\n"; cout<<"\\n\为保护员工信息,只有管理员才可以进行管理!\\n"; cout<<"\\n\管理员名和登陆密码都只有4次机会,如果超过将自动退出系统!\\n\\n"; cout<<"****************************************************************************\\n"; cout<<"\\n请输入管理员名:"; cin>>UserName; while (strcmp(UserName,"1")!=0) { if(i>=3) exit(0); //超过4次则登陆失败,退出系统 i++; cout<<"\\n管理员名无效!请重新输入:"; cin>>UserName; } cout<<"\\n请输入密码:"; cin>>Passward; while(strcmp(Passward,"1")!=0) { if(i>=3) exit(0); //超过4次则登陆失败,退出系统 i++; cout<<"\\n密码输入错误!请重新输入:"< } cout<<"\\n\\欢迎管理员的到来\\n"< //------------------------------>主函数. int main(void) { 设置背景色和字体颜色 system("PAUSE"); //系统暂停 系统清屏 Pass(); system("cls"); } //
