职工工资管理系统

2020-05-08 社会 60阅读
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int shoudsave=0;
char dir[15];
struct member
{
char num[5];//编号
char name[15];
char sex[1];
float spercent;
float zpercent;
float xpercent;
float jiangjin;
float totle;
float ave;
}; //一个结构体
typedef struct node
{
struct member data;//指向结构体的结构体
struct node *next;
}Node,*Link;
void explain()
{printf("=============================关于此程序的操作说明==============================\n");
printf("===1>:员工每旬应该完成量为33.3个百分点,输入只输数字部分。\n");
printf("===2>:员工每月应该完成量完成量为100个百分点。\n");
printf("===3>:员工奖金按其超额总应该完成量(即百分之百)的多少计算。\n");
printf("===4>:奖金=(总完成比-1)*1000。\n");
printf("===5>:员工底金为1000元。\n");
printf("===6>:逻辑删除资料必须在已经保存了先前记录的基础上方可进行。\n");
printf("===7>:进行逻辑删除资料后如果保存即变为物理删除。\n");
printf("===8>:本程序在c++环境中完成,程序文件扩展名为.c。\n");
}
void menu() //菜单
{
printf("********************************************************************************");
printf("\t1获取说明信息\t\t\t\t\t 2输入员工资料\n");
printf("\t3删除员工资料\t\t\t\t\t 4查询员工资料\n");
printf("\t5修改员工资料\t\t\t\t\t 6显示员工资料\n");
printf("\t7统计员工业绩\t\t\t\t\t 8排序员工实发工资\n");
printf("\t9保存员工资料\t\t\t\t\t10逻辑删除员工资料\n");
printf("\t0退出系统\n");
printf("********************************************************************************\n");
}
void printc() // 本函数用于输出中文
{
printf("编号 姓名 性别 总完成比 旬平均 基本工资 奖金 工资总额 \n");
}
void printe(Node *p)//本函数用于输出英文
{
printf("%-5s%-10s%-4s%6.1f %6.1f %6.1f %6.1f %6.1f\n",p->data.num,p->data.name,p->data.sex,p->data.totle,p->data.ave,1000.0,p->data.jiangjin,1000+p->data.jiangjin);
}
void printstart()
{
printf("-----------------------------------------------------------------------\n");
}
void Wrong() //如果错误
{
printf("\n=====>提示:输入错误!\n");
}
void Nofind() //如果没找到
{
printf("\n=====>提示:没有找到该员工!\n");
}
Node* Locate(Link l,char findmess[],char nameornum[]) //该函数用于定位连表中符合要求的接点,并返回该指针
{
Node *r;
if(strcmp(nameornum,"num")==0) //按编号查询
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;
}
}
else if(strcmp(nameornum,"name")==0) //按姓名查询
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;
}
}
return 0;
}
void Add(Link l) //增加员工
{
Node *p,*r,*s;
char num[10];
r=l;
s=l->next;
while(r->next!=NULL)
r=r->next; //将指针置于最末尾
//while(1)
{
printf("请你输入编号(以'0'返回上一级菜单:)");
fflush(stdin);
gets(num);
if(strcmp(num,"0")==0)return;//比较判断是否返回
//break;
}
while(s)
{
if(strcmp(s->data.num,num)==0) //比较判断是否重复
{
printf("=====>提示:编号为'%s'的员工已经存在,若要修改请你选择'4 修改'!\n",num);
printstart();
printc();
printe(s);
printstart();
printf("\n");
return;
}
s=s->next;
}
p=(Node *)malloc(sizeof(Node)); //开辟一个指定大小的存储空间
strcpy(p->data.num,num);
printf("请您输入姓名:");
scanf("%s",p->data.name);
getchar();
printf("请您输入性别(m/f):");
scanf("%s",p->data.sex);
getchar();
printf("请您输入上旬完成(百分比):");
scanf("%f",&p->data.spercent);
getchar();
printf("请您输入中旬完成(百分比):");
scanf("%f",&p->data.zpercent);
getchar();
printf("请您输入下旬完成(百分比):");
scanf("%f",&p->data.xpercent);
getchar();
p->data.totle=p->data.spercent+p->data.zpercent+p->data.xpercent;
p->data.ave=p->data.totle / 3;
if(p->data.totle<100)
{p->data.jiangjin=(p->data.totle-100)*10;}
else p->data.jiangjin=(p->data.totle-100)*10;
//信息输入已经完成
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;
}
void Search(Link l) //查询员工
{
int sel;
char findmess[20];
Node *p;
if(!l->next)
{
printf("\n=====>提示:没有资料可以查询!\n");
return;
}
printf("\n=====>1按编号查找\n======>2按姓名查找\n======>3返回上一级菜单\n");
scanf("%d",&sel);
if(sel==3)
{return;}
if(sel==1)//编号
{
printf("请您输入要查找的编号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num"); //定位链表中符合要求的节点
if(p)
{
printf("\t\t\t查找结果(完成单位:个百分比)\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else
if(sel==2) //姓名
{
printf("请您输入要查找的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name"); //定位链表中符合要求的节点
if(p)
{
printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else
Wrong();
}
void Del(Link l) //物理删除
{
int sel;
Node *p,*r;
char findmess[20];
if(!l->next)
{
printf("\n=====>提示:没有资料可以删除!\n");
return;
}
printf("\n=====>1按编号删除\n=====>2按姓名删除\n======>3返回上一级菜单\n");
scanf("%d",&sel);
if(sel==3)
{return;}
if(sel==1)
{
printf("请你输入要删除的编号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num"); //定位链表中符合要求的节点
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:该员工已经成功删除!\n");
shoudsave=1;
}
else
Nofind();
}
else if(sel==2)
{
printf("请你输入要删除的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");//定位链表中符合要求的节点
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:该员工已经成功删除!\n");
shoudsave=1;
}
else
Nofind();
}
else
Wrong();
}
void Ndel(Link l) //逻辑删除
{
int sel;
Node *p,*r;
char findmess[20];
if(shoudsave==1)
{printf("\n=====>提示:请您先保存已输入的记录,再进行逻辑删除。要物理删除请按3。\n");
return;
}
if(!l->next)
{
printf("\n=====>提示:没有资料可以删除!\n");
return;
}
printf("\n=====>1按编号删除\n=====>2按姓名删除\n======>3返回上一级菜单\n");
scanf("%d",&sel);
if(sel==3)
{return;}
if(sel==1)
{
printf("请你输入要删除的编号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");//定位链表中符合要求的节点
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:该员工已经成功删除!\n");
shoudsave=0;
}
else
Nofind();
}
else if(sel==2)
{
printf("请你输入要删除的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name"); //定位链表中符合要求的节点
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:该员工已经成功删除!\n");
shoudsave=0;
}
else
Nofind();
}
else
Wrong();
}

void Modify(Link l) //修改员工资料
{ int choose;
Node *p;
char findmess[20];
if(!l->next)
{
printf("\n=====>提示:没有资料可以修改!\n");
return;
}
printf("请你输入要修改的员工编号(以0返回上一级菜单):");
scanf("%s",findmess);
if(strcmp(findmess,"0")==0) return;
p=Locate(l,findmess,"num"); //定位链表中符合要求的节点
if(p)
{printf("=========>1:修改员工编号;\n");
printf("=========>2:修改员工姓名;\n");
printf("=========>3:修改员工性别;\n");
printf("=========>4:修改员工上旬完成百分比;\n");
printf("=========>5:修改员工中旬完成百分比;\n");
printf("=========>6:修改员工下旬完成百分比;\n");
printf("\n-------请你输入要修改的员工条目:");
scanf("%d",&choose);
switch(choose)
{ case 1: printf("请你输入新编号(原来是%s):",p->data.num);
scanf("%s",p->data.num); break;
case 2: printf("请你输入新姓名(原来是%s):",p->data.name);
scanf("%s",p->data.name);
getchar(); break;
case 3: printf("请你输入新性别(原来是%s):",p->data.sex);
scanf("%s",p->data.sex); break;
case 4: printf("请你输入新的上旬完成百分比(原来是%5.2f ):",p->data.spercent);
scanf("%f",&p->data.spercent);
getchar();
p->data.totle=p->data.spercent+p->data.zpercent+p->data.xpercent;
p->data.ave=p->data.totle / 3;
if(p->data.totle<100)
{p->data.jiangjin=(p->data.totle-100)*10;}
else p->data.jiangjin=(p->data.totle-100)*10;
break;
case 5: printf("请你输入新的中旬完成百分比(原来是%5.2f ):",p->data.zpercent);
scanf("%f",&p->data.zpercent);
getchar();
p->data.totle=p->data.spercent+p->data.zpercent+p->data.xpercent;
p->data.ave=p->data.totle / 3;
if(p->data.totle<100)
{p->data.jiangjin=(p->data.totle-100)*10;}
else p->data.jiangjin=(p->data.totle-100)*10;
break;
case 6: printf("请你输入新的下旬完成百分比(原来是%5.2f ):",p->data.xpercent);
p->data.totle=p->data.spercent+p->data.zpercent+p->data.xpercent;
p->data.ave=p->data.totle / 3;
if(p->data.totle<100)
{p->data.jiangjin=(p->data.totle-100)*10;}
else p->data.jiangjin=(p->data.totle-100)*10;
break;
default: Wrong();return;
}
printf("\n=====>提示:资料修改成功!\n");
shoudsave=1;
}
else
Nofind();
}
void Disp(Link l) //显示员工资料
{
int count=0;
Node *p;
p=l->next;
if(!p)
{
printf("\n=====>提示:没有资料可以显示!\n");
return;
}
printf("\t\t\t显示结果(完成单位:个百分比)\n");
printstart();
printc();
printf("\n");
while(p)
{
printe(p);
p=p->next;
}
printstart();
printf("\n");
}
void Tongji(Link l) //统计员工资料
{
Node *pz,*px,*ps,*pt,*pa,*pj; //用于指向分数最高的接点
Node *r=l->next;
if(!r)
{
printf("\n=====>提示:没有资料可以统计!\n");
return ;
}
ps=pz=px=pt=pa=pj=r;
while(r!=NULL)
{
if(r->data.spercent>=ps->data.spercent)
ps=r;
if(r->data.zpercent>=pz->data.zpercent)
pz=r;
if(r->data.xpercent>=px->data.xpercent)
px=r;
if(r->data.totle>=pt->data.totle)
pt=r;
if(r->data.ave>=pa->data.ave)
pa=r;
if(r->data.jiangjin>=pa->data.jiangjin)
pj=r;
r=r->next;
}
printf("-----------------统计结果--------------------------\n");
printf("月总完成最高者:\t%s %5.2f个百分比\n",pt->data.name,pt->data.totle);
printf("平均完成最高者:\t%s %5.2f个百分比\n",pa->data.name,pa->data.ave);
printf("上旬完成最高者:\t%s %5.2f个百分比\n",ps->data.name,ps->data.spercent);
printf("中旬完成最高者:\t%s %5.2f个百分比\n",pz->data.name,pz->data.zpercent);
printf("下旬完成最高者:\t%s %5.2f个百分比\n",px->data.name,px->data.xpercent);
printf(" 奖金最高者:\t%s %5.2f元\n",pj->data.name,pj->data.jiangjin);
printstart();
}
void Sort(Link l)//按员工实发工资(即其完成额大小)排序
{int m;
Link ll;
Node *p,*rr,*s;
ll=(Link)malloc(sizeof(Node)); //用于做新的链表
ll->next=NULL;
if(l->next==NULL)
{
printf("\n=====>提示:没有资料可以排序!\n");
return ;
}
p=l->next;
while(p)
{
s=(Node*)malloc(sizeof(Node)); //新建接点用于保存信息
s->data=p->data;
s->next=NULL;
rr=ll;
while(rr->next!=NULL && rr->next->data.totle>=p->data.totle)
rr=rr->next;
if(rr->next==NULL)
rr->next=s;
else
{
s->next=rr->next;
rr->next=s;
}
p=p->next;
}
free(l);
l->next=ll->next;
printf("\n=====>提示:排序已经完成!\n");
for(m=1;rr->next!=NULL;m++)
{rr=rr->next;
printf("\n第%d名",m); printf("\n编号:%s",rr->data.num);printf(" 姓名:%s",rr->data.name); printf(" 性别:%s",rr->data.sex); printf(" 工资总额:%5.2f+1000\n",rr->data.ave);
}
}
void Save(Link l) //保存已经输入的员工资料
{
FILE* fp;
Node *p;
int flag=1,count=0;
fp=fopen(dir,"wb");
if(fp==NULL)
{
printf("\n=====>提示:重新打开文件时发生错误!\n");
exit(1);
}
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p=p->next;
count++;
}
else
{
flag=0;
break;
}
}
if(flag)
{
printf("\n=====>提示:文件保存成功.(有%d条记录已经保存.)\n",count);
shoudsave=0;
}
fclose(fp);
}
void main() //主函数Main
{
Link l;//连表
FILE *fp; //文件指针
int sel;
char ch;
char jian;
int count=0;
//char mima[10];
Node *p,*r;
printf("\t\t\t员工工资管理系统\n\t\t\t\t------电子1班\n\t\t\t\t\t孙大光\n");
l=(Node*)malloc(sizeof(Node));
l->next=NULL;
r=l;
fp=fopen("C:\\member1","rb");//打开文件夹
if(fp==NULL)
{
printf("\n=====>提示:文件还不存在,是否创建?(y/n)\n");
scanf("%c",&jian);
if(jian=='y'||jian=='Y')
{printf("输入路径:");
scanf("%s",dir);
fp=fopen(dir,"wb");}
else exit(0);
if(fp)
{printf("\n=====>提示:文件已经打开,正在导入记录......\n");
printf("\n=====>提示:记录导入完毕,共导入%d条记录.\n",0); }
}
else
{while(!feof(fp))
{
p=(Node*)malloc(sizeof(Node)); //开辟一个指定大小的存储空间
if(fread(p,sizeof(Node),1,fp)) //将文件的内容放入接点中
{
p->next=NULL;
r->next=p;
r=p; //将该接点挂入连中
count++;
}
}
fclose(fp); //关闭文件
printf("\n=====>提示:记录导入完毕,共导入%d条记录.\n",count);
}
while(1)
{
menu();
printf("请你选择操作:");
scanf("%d",&sel);
if(sel==0)
{
if(shoudsave==1)
{ getchar();
printf("\n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)?\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save(l);
}
printf("\n=====> 您已经退出系统,谢谢您的使用,再见!\n");
break;
}
switch(sel)
{
case 1:explain();break; //操作说明
case 2:Add(l);break; //增加员工资料
case 3:Del(l);break;//删除员工资料
case 4:Search(l);break;//查询员工资料
case 5:Modify(l);break;//修改员工资料
case 6:Disp(l);break;//显示员工资料
case 7:Tongji(l);break;//统计员工资料
case 8:Sort(l);break;//排序员工资料
case 9:Save(l);break;//保存员工资料
case 10:Ndel(l);break;//逻辑删除员工资料
default: Wrong();getchar();break;
}
}
}
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com