人事管理系统C 源代码.docx
《人事管理系统C 源代码.docx》由会员分享,可在线阅读,更多相关《人事管理系统C 源代码.docx(26页珍藏版)》请在冰豆网上搜索。
人事管理系统C源代码
#include"stdio.h"/*标准输入输出函数库*/
#include"stdlib.h"/*标准函数库*/
#include"string.h"/*字符串函数库*/
#include"conio.h"/*屏幕操作函数库*/
#defineHEADER1"-------------------------------RSDA----------------------------------------\n"
#defineHEADER2"|number|name|jbgz|jj|kk|yfgz|sk|sfgz|\n"
#defineHEADER3"|--------|-----------|--------|--------|--------|--------|--------|--------|\n"
#defineFORMAT"|%-8s|%-10s|%8.2f|%8.2f|%8.2f|%8.2f|%8.2f|%8.2f|\n"
#defineDATAp->num,p->name,p->jbgz,p->jj,p->kk,p->yfgz,p->sk,p->sfgz
#defineEND"----------------------------------------------------------------------------\n"
#defineN60
intsaveflag=0;/*是否需要存盘的标志变量*/
/*定义与职工有关的数据结构*/
typedefstructemployee/*标记为employee*/
{
charnum[10];/*职工编号*/
charname[15];/*职工姓名*/
floatjbgz;/*基本工资*/
floatjj;/*奖金*/
floatkk;/*扣款*/
floatyfgz;/*应发工资*/
floatsk;/*税款*/
floatsfgz;/*实发工资*/
}RSDA;
voidmenu()/*主菜单*/
{
system("cls");/*调用DOS命令,清屏.与clrscr()功能相同*/
printf("TheEmployeeManagementSystem\n");
printf("*************************Menu********************************\n");
printf("*1inputrecord2deleterecord*\n");
printf("*3searchrecord4modifyrecord*\n");
printf("*5insertrecord6countrecord*\n");
printf("*7sortrecord8saverecord*\n");
printf("*9displayrecord0quitsystem*\n");
printf("*************************************************************\n");
/*printf()送格式化输出至屏幕中*/
}
voidprintheader()/*格式化输出表头*/
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
voidprintdata(RSDApp)/*格式化输出表中数据*/
{
RSDA*p;
p=&pp;
printf(FORMAT,DATA);
}
voidDisp(RSDAtp[],intn)/*显示数组tp[]中存储的记录,内容为employee结构中定义的内容*/
{
inti;
if(n==0)/*表示没有职工工资记录*/
{
printf("\n=====>Notemployeerecord!
\n");
while(getchar()!
='\n')
continue;
getchar();
return;
}
printf("\n\n");
printheader();/*输出表格头部*/
i=0;
while(i{
printdata(tp[i]);
i;
printf(HEADER3);
}
while(getchar()!
='\n')
continue;
getchar();
}
voidWrong()/*输出按键错误信息*/
{
printf("\n\n\n\n\n***********Error:
inputhaswrong!
pressanykeytocontinue**********\n");
while(getchar()!
='\n')
continue;
getchar();
}
voidNofind()/*输出未查找到此职工的信息*/
{
printf("\n=====>Notfindthisemployeerecord!
\n");
}
/*************************************************************
作用:
用于定位数组中符合要求的记录,并返回保存该记录的数组元素下标值
参数:
findmess[]保存要查找的具体内容;nameornum[]保存按什么在数组中查找
**************************************************************/
intLocate(RSDAtp[],intn,charfindmess[],charnameornum[])
{
inti=0;
if(strcmp(nameornum,"num")==0)/*按职工编号查询*/
{
while(i{
if(strcmp(tp[i].num,findmess)==0)/*若找到findmess值的职工编号*/
returni;
i;
}
}
elseif(strcmp(nameornum,"name")==0)/*按职工姓名查询*/
{
while(i{
if(strcmp(tp[i].name,findmess)==0)/*若找到findmess值的姓名*/
returni;
i;
}
}
return-1;/*若未找到,返回一个整数-1*/
}
/*输入字符串,并进行长度验证(长度voidstringinput(char*t,intlens,char*notice)
{
charn[255];
do{
printf(notice);/*显示提示信息*/
scanf("%s",n);/*输入字符串*/
if(strlen(n)>lens)printf("\nexceedtherequiredlength!
\n");/*进行长度校验,超过lens值重新输入*/
}while(strlen(n)>lens);
strcpy(t,n);/*将输入的字符串复制到字符串t中*/
}
/*输入数值,0<=数值)*/
floatnumberinput(char*notice)
{
floatt=0.00;
do{
printf(notice);/*显示提示信息*/
scanf("%f",&t);/*输入如工资等数值型的值*/
if(t<0)printf("\nscoremust>=0!
\n");/*进行数值校验*/
}while(t<0);
returnt;
}
/*增加职工工资记录*/
intAdd(RSDAtp[],intn)
{
charch,num[10];
inti,flag=0;
system("cls");
Disp(tp,n);/*先打印出已有的职工工资信息*/
while
(1)/*一次可输入多条记录,直至输入职工编号为0的记录结束添加操作*/
{
while
(1)/*输入职工编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/
{
stringinput(num,10,"inputnumber(press'0'returnmenu):
");/*格式化输入编号并检验*/
flag=0;
if(strcmp(num,"0")==0)/*输入为0,则退出添加操作,返回主界面*/
{returnn;}
i=0;
while(i{
if(strcmp(tp[i].num,num)==0)
{
flag=1;
break;
}
i;
}
if(flag==1)/*提示用户是否重新输入*/
{getchar();
printf("==>Thenumber%sisexisting,tryagain?
(y/n):
",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
continue;
else
returnn;
}
else
{break;}
}
strcpy(tp[n].num,num);/*将字符串num复制到tp[n].num中*/
stringinput(tp[n].name,15,"Name:
");
tp[n].jbgz=numberinput("jbgz:
");/*输入并检验基本工资*/
tp[n].jj=numberinput("jiangjin:
");/*输入并检验奖金*/
tp[n].kk=numberinput("koukuan:
");/*输入并检验扣款*/
tp[n].yfgz=tp[n].jbgztp[n].jj-tp[n].kk;/*计算应发工资*/
tp[n].sk=tp[n].yfgz*0.12;/*计算税金,这里取应发工资的12%*/
tp[n].sfgz=tp[n].yfgz-tp[n].sk;/*计算实发工资*/
saveflag=1;
n;
}
returnn;
}
/*按职工编号或姓名,查询记录*/
voidQur(RSDAtp[],intn)
{
intselect;/*1:
按编号查,2:
按姓名查,其他:
返回主界面(菜单)*/
charsearchinput[20];/*保存用户输入的查询内容*/
intp=0;
if(n<=0)/*若数组为空*/
{
system("cls");
printf("\n=====>Noemployeerecord!
\n");
getchar();
return;
}
system("cls");
printf("\n=====>1Searchbynumber=====>2Searchbyname\n");
printf("pleasechoice[1,2]:
");
scanf("%d",&select);
if(select==1)/*按编号查询*/
{
stringinput(searchinput,10,"inputtheexistingemployeenumber:
");
p=Locate(tp,n,searchinput,"num");/*在数组tp中查找编号为searchinput值的元素,并返回该数组元素的下标值*/
if(p!
=-1)/*若找到该记录*/
{
printheader();
printdata(tp[p]);
printf(END);
printf("pressanykeytoreturn");
getchar();
}
else
Nofind();
getchar();
}
elseif(select==2)/*按姓名查询*/
{
stringinput(searchinput,15,"inputtheexistingemployeename:
");
p=Locate(tp,n,searchinput,"name");
if(p!
=-1)
{
printheader();
printdata(tp[p]);
printf(END);
printf("pressanykeytoreturn");
getchar();
}
else
Nofind();
getchar();
}
else
Wrong();
getchar();
}
/*删除记录:
先找到保存该记录的数组元素的下标值,然后在数组中删除该数组元素*/
intDel(RSDAtp[],intn)
{
intsel;
charfindmess[20];
intp=0,i=0;
if(n<=0)
{system("cls");
printf("\n=====>Noemployeerecord!
\n");
getchar();
returnn;
}
system("cls");
Disp(tp,n);
printf("\n=====>1Deletebynumber=====>2Deletebyname\n");
printf("pleasechoice[1,2]:
");
scanf("%d",&sel);
if(sel==1)
{
stringinput(findmess,10,"inputtheexistingemployeenumber:
");
p=Locate(tp,n,findmess,"num");
getchar();
if(p!
=-1)
{
for(i=p1;i{
strcpy(tp[i-1].num,tp[i].num);
strcpy(tp[i-1].name,tp[i].name);
tp[i-1].jbgz=tp[i].jbgz;
tp[i-1].jj=tp[i].jj;
tp[i-1].kk=tp[i].kk;
tp[i-1].yfgz=tp[i].yfgz;
tp[i-1].jbgz=tp[i].sk;
tp[i-1].sfgz=tp[i].sfgz;
}
printf("\n==>deletesuccess!
\n");
n--;
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
elseif(sel==2)/*先按姓名查询到该记录所在的数组元素的下标值*/
{
stringinput(findmess,15,"inputtheexistingemployeename:
");
p=Locate(tp,n,findmess,"name");
getchar();
if(p!
=-1)
{
for(i=p1;i{
strcpy(tp[i-1].num,tp[i].num);
strcpy(tp[i-1].name,tp[i].name);
tp[i-1].jbgz=tp[i].jbgz;
tp[i-1].jj=tp[i].jj;
tp[i-1].kk=tp[i].kk;
tp[i-1].yfgz=tp[i].yfgz;
tp[i-1].jbgz=tp[i].sk;
tp[i-1].sfgz=tp[i].sfgz;
}
printf("\n=====>deletesuccess!
\n");
n--;
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
returnn;
}
/*修改记录:
先按输入的职工编号查询到该记录,然后提示用户修改编号之外的值,编号不能修改*/
voidModify(RSDAtp[],intn)
{
charfindmess[20];
intp=0;
if(n<=0)
{system("cls");
printf("\n=====>Noemployeerecord!
\n");
getchar();
return;
}
system("cls");
printf("modifyemployeerecorder");
Disp(tp,n);
stringinput(findmess,10,"inputtheexistingemployeenumber:
");/*输入并检验该编号*/
p=Locate(tp,n,findmess,"num");/*查询到该数组元素,并返回下标值*/
if(p!
=-1)/*若p!
=-1,表明已经找到该数组元素*/
{
printf("Number:
%s,\n",tp[p].num);
printf("Name:
%s,",tp[p].name);
stringinput(tp[p].name,15,"inputnewname:
");
printf("jbgz:
%8.2f,",tp[p].jbgz);
tp[p].jbgz=numberinput("jbgz:
");
printf("jiangjin:
%8.2f,",tp[p].jj);
tp[p].jj=numberinput("jiangjin:
");
printf("koukuan:
%8.2f,",tp[p].kk);
tp[p].kk=numberinput("koukuan:
");
tp[n].yfgz=tp[n].jbgztp[n].jj-tp[n].kk;
tp[n].sk=tp[n].yfgz*0.12;
tp[n].sfgz=tp[n].yfgz-tp[n].sk;
printf("\n=====>modifysuccess!
\n");
getchar();
Disp(tp,n);
getchar();
saveflag=1;
}
else
{Nofind();
getchar();
}
return;
}
/*插入记录:
按职工编号查询到要插入的数组元素的位置,然后在该编号之后插入一个新数组元素。
*/
intInsert(RSDAtp[],intn)
{
charch,num[10],s[10];/*s[]保存插入点位置之前的编号,num[]保存输入的新记录的编号*/
RSDAnewinfo;
intflag=0,i=0,kkk=0;
system("cls");
Disp(tp,n);
while
(1)
{stringinput(s,10,"pleaseinputinsertlocationaftertheNumber:
");
flag=0;i=0;
while(i{
if(strcmp(tp[i].num,s)==0){kkk=i;flag=1;break;}
i;
}
if(flag==1)
break;/*若编号存在,则进行插入之前的新记录输入操作*/
else
{getchar();
printf("\n=====>Thenumber%sisnotexisting,tryagain?
(y/n):
",s);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{returnn;}
}
}
/*以下新记录的输入操作与Add()相同*/
while
(1)
{stringinput(num,10,"inputnewemployeeNumber:
");
i=0;flag=0;
while(i{
if(strcmp(tp[i].num,num)==0){flag=1;break;}
i;
}
if(flag==1)
{
getchar();
printf("\n=====>Sorry,Thenumber%sisexisting,tryagain?
(y/n):
",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{returnn;}
}
else
break;
}
strcpy(newinfo.num,num);/*将字符串num复制到newinfo.num中*/
stringinput(newinfo.name,15,"Name:
");
newinfo.jbgz=numberinput("jbgz:
");/*输入并检验jbgz*/
newinfo.jj=numberinput("jiangjin:
");/*输入并检验jiangjin*/
newinfo.kk=numberinput("koukuan:
");/*输入并检验koukuan*/
newinfo.yfgz=newinfo.jbgznewinfo.jj-newinfo.kk;/*计算yfgz*/
newinfo.sk=newinfo.yfgz*0.12;/*计算sk*/
newinfo.sfgz=newinfo.yfgz-newinfo.sk;
saveflag=1;/*在main()有对该全局变量的判断,若为1,则进行存盘操作*/
for(i=n-1;i>kkk;i--)/*从最后一个组织元素开始往向移动一个元素的位置*/
{strcpy(tp[i1].num,tp[i].num);
strcpy(tp[i1].name,tp[i].name);
tp[i1].jbgz=tp[i].jbgz;
tp[i1].jj=tp[i].jj;
tp[i1].kk=tp[i].kk;
tp[i1].yfgz=tp[i].yfgz;
tp[i1].sk=tp[i].sk;
tp[i1].sfgz=tp[i].sfgz;
}
strcpy(tp[kkk1].num,ne