#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
#define HEADER1 " ------------------------------职工工资表--------------------------------------- \n"
#define HEADER2 "|职工工号| 职工姓名 | 职工年龄| 职工性别 | 基本工资 | 岗位工资 | 总工资| \n"
#define HEADER3 "|--------|-----------|---------|----------|-----------|-----------|-------| \n"
#define FORMAT "|%-8s|%-10s |%-9d|%-10s|%-11.0f|%-11.0f|%-7.0f|\n"
#define DATA p->num,p->name,p->age,p->sex,p->jbgz,p->gwgz,p->zgz
#define END "------------------------------------------------------------------- --------\n"
#define N 5
/********************************************************************************************************
定义结构体
*********************************************************************************************************/
/*定义与职工有关的数据结构*/
typedef struct emp /*标记为emp*/
{
char num[10]; /*职工编号*/
char name[15]; /*职工姓名*/
int age; /*年龄*/
char sex[10]; /*性别*/
float jbgz; /*基本工资*/
float gwgz; /*岗位工资*/
float zgz; /*总工资*/
}EMP;
void save(EMP emp[] ,int n);
int Locate(EMP emp[],int n);
/****************************************************************************************************
显示菜单
****************************************************************************************************/
char displaymenu()
{
char k;
system("cls");
printf(" 职工工资系统 \n");
printf(" *************************菜单********************************\n");
printf(" * 1 添加职工信息 2 输出职工信息 *\n");
printf(" * 3 查询职工信息 4 修改职工信息 *\n");
printf(" * 5 职工工资排序 6 职工工资统计 *\n");
printf(" * 7 导出数据 8 导入数据 *\n");
printf(" * 9 退出系统 *\n");
printf(" 请选择你想进行的操作:");
k=getchar();
printf(" ***************************************************************\n");
return k;
}
/******************************************************************************************************
定义输出函数
*******************************************************************************************************/
void printheader() /*格式化输出表头*/
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
void printdata(EMP pp) /*格式化输出表中数据*/
{
EMP* p;
p=&pp;
printf(FORMAT,DATA);
}
/************************************************************************************
添加职工信息
************************************************************************************/
int add(EMP emp[] ,int *n)
{
int i=0;
system("cls");
printf("*****************请输入职工信息********\n");
printf("请输入职工工号:\n");
scanf("%s",emp[i].num);
while(strcmp(emp[i].num,"0") )
{
printf("请输入职工姓名: \n");
scanf("%s",emp[i].name);
printf("请输入职工年龄:\n ");
scanf("%d",&emp[i].age);
printf("请输入职工性别: \n");
scanf("%s",emp[i].sex);
printf("请输入职工基本工资: \n");
scanf("%f",&emp[i].jbgz);
printf("请输入职工岗位工资: \n");
scanf("%f",&emp[i].gwgz);
emp[i].zgz=emp[i].jbgz+emp[i].gwgz;
printf("职工总工资:\n %-8.0f\n",emp[i].zgz);
i++;
printf("请输入职工工号:\n");
scanf("%s",emp[i].num);
}
*n=i;
save(emp ,i);
return i;
}
/*****************************************************************************************************
显示函数
******************************************************************************************************/
void Disp(EMP emp[],int n) /*显示数组emp[]中存储的记录,内容为employee结构中定义的内容*/
{
int i;
system("cls");
if(n==0) /*表示没有职工工资记录*/
{
printf("\n=====>没有职工记录!\n");
}
printf("\n\n");
printheader(); /*输出表格头部*/
i=0;
while(i<n) /*逐条输出数组中存储的职工信息*/
{
printdata(emp[i]);
i++;
printf(HEADER3);
}
getchar();
}
/*********************************************************************************************************
查询职工信息函数
**********************************************************************************************************/
int Locate(EMP emp[],int n)
{
int k,m=-1;
char num[10],name[20];
int i=0;
system("cls");
printf("请选择以什么方式查询:1.按职工工号查询 2.按职工姓名查询 \n ");
scanf("%d",&k);
if(k==1)
{
printf("请输入你要查询的职工工号:\n");
scanf("%s",num);
while(i<n)
{
if(strcmp(emp[i].num,num)==0) /*若找到工号*/
{
printf("职工工号:%s\n职工姓名:%s\n职工年龄:%d\n职工性别:%s\n职工基本工资:%-8.0f\n职工岗位工资:%-8.0f\n职工总工资:%-8.0f\n",emp[i].num,emp[i].name,emp[i].age,emp[i].sex,emp[i].jbgz,emp[i].gwgz,emp[i].zgz);
m=i;
getchar();
break;
}
i++;
}
if(i>=n)
printf("没有所找职工信息\n");
getchar();
}
else if(k==2)
{
printf("请输入你要查询的职工姓名:\n");
scanf("%s",name);
while(i<n)
{
if(strcmp(emp[i].name,name)==0) /*若找到姓名*/
{ printf("职工工号:%s\n职工姓名:%s\n职工年龄:%d\n职工性别:%s\n职工基本工资:%-8.0f\n职工岗位工资:%-8.0f\n职工总工资:%-8.0f\n",emp[i].num,emp[i].name,emp[i].age,emp[i].sex,emp[i].jbgz,emp[i].gwgz,emp[i].zgz);
m=i;
getchar();
break;
}
i++;
}
if(i>=n)
printf("没有所找职工信息\n");
}
return m;/*返回一个整数m*/
getchar();
}
/************************************************************************************************
修改职工信息。先按输入的职工编号查询到该记录,然后提示用户修改编号之外的值,编号不能修改
*************************************************************************************************/
void Modify(EMP emp[],int n)
{
int i;
if(n<=0)
{
system("cls");
printf("\n=====>No employee record!\n");
getchar();
return ;
}
system("cls");
printf("修改职工信息");
Disp(emp,n);
i=Locate(emp,n); /*查询到该数组元素,并返回下标值*/
if(i!=-1) /*若p!=-1,表明已经找到该数组元素*/
{
printf("请输入新的职工信息: \n");
printf("职工工号:\n");
scanf("%s",emp[i].num);
printf("职工姓名: \n");
scanf("%s",emp[i].name);
printf("职工年龄:\n ");
scanf("%d",&emp[i].age);
printf("职工性别: \n");
scanf("%s",emp[i].sex);
printf("职工基本工资: \n");
scanf("%f",&emp[i].jbgz);
printf("职工岗位工资: \n");
scanf("%f",&emp[i].gwgz);
emp[i].zgz=emp[i].jbgz+emp[i].gwgz;
printf("职工总工资:\n %-8.0f\n",emp[i].zgz);
save(emp ,n);
printf("\n=====>修改成功!\n");
getchar();
Disp(emp,n);
getchar();
}
else
printf("没有职工信息\n");
getchar();
}
/************************************************************************************************
统计公司的员工的工资在各等级的人数
************************************************************************************************/
void Tongji(EMP emp[],int n)
{
int count2000=0,count3000=0,count0=0;
int i=0;
system("cls");
Disp(emp,n);
i=0;
while(i<n)
{
if(emp[i].zgz>=3000) {count3000++;i=i+1;continue;} /*实发工资>3000*/
if(emp[i].zgz>=2000) {count2000++;i=i+1;continue;} /*2000<=实发工资<3000*/
if(emp[i].zgz<2000) {count0++;i=i+1;continue;} /*实发工资<2000*/
}
printf("\n------------------------------the TongJi result--------------------------------\n");
printf("zgz >= 3000:%d (ren)\n",count3000);
printf("2000<=zgz<3000:%d (ren)\n",count2000);
printf("zgz < 2000:%d (ren)\n",count0);
printf("-------------------------------------------------------------------------------\n");
printf("\n\n**************统计结束****************");
getchar();
}
/************************************************************************************************
导出数据
************************************************************************************************/
void save(EMP emp[],int n)
{
FILE* fp;
int i=0;
fp=fopen("emp","wb+");/*以只写方式打开二进制文件*/
if(fp==NULL) /*打开文件失败*/
{
printf("\n=====>打开文件错误!\n");
return ;
}
for(i=0;i<n;i++)
{
if(fwrite(&emp[i],sizeof(EMP),1,fp)==1)/*每次写一条记录或一个结构数组元素至文件*/
{
continue;
}
else
{
break;
}
}
if(i>0)
{
getchar();
printf("\n\n*******导出完成,总共导出个数为:%d ********************\n",i);
getchar();
}
else
{
system("cls");
printf("************没有信息导出!!!********************\n");
getchar();
}
fclose(fp); /*关闭此文件*/
}
/**************************************************************************************
导入数据
**************************************************************************************/
void Read(EMP emp[],int * n)
{
FILE* fp;
int i=0;
fp=fopen("emp","rb");/*以只读方式打开二进制文件*/
if(fp==NULL) /*打开文件失败*/
{
printf("\n=====>打开文件错误!\n");
exit(0);
}
for(i=0;i<N;i++)
{
if(fread(&emp[i],sizeof(EMP),1,fp)==1)/*如果读过程发生错误*/
continue;
else
break;
}
*n=i;
if(i>0)
{
printf("\n\n******导入完成,总共导入个数为:%d **************\n",i);
getchar();
}
else
{ system("cls");
printf("************没有信息导入!!!********************\n");
getchar();
}
getchar();
fclose(fp); /*关闭此文件*/
}
/**********************************************************************************************
职工总工资排序
**********************************************************************************************/
/*用冒泡法对职工总工资排序*/
void sort(EMP emp[],int n)
{
int i,j;
float t;
for(i=0;i<n;i++)
for(j=0;j<n-i;j++)
if(emp[j].zgz<emp[j+1].zgz)
{
t=emp[j].zgz;
emp[j].zgz=emp[j+1].zgz;
emp[j+1].zgz=t;
}
Disp(emp,n); /*显示排序后的所有记录*/
save(emp ,n);
printf("\n =====>sort complete!\n");
}
/*选择法对职工总工资排序*
void sort1(EMP emp[],int n)
{int i,j,k;
float t;
for(i=0; i<N-1; i++)
{k=i;
for(j=i+1; j<N; j++)
if(emp[j].zgz>emp[k].zgz) k=j;
if (k!=i)
{t=emp[i].zgz; emp[i].zgz=emp[k].zgz;emp[k].zgz=t;} /* a[i]和a[k]互换 *
Disp(emp,n); /*显示排序后的所有记录*
saveflag=1;
printf("\n =====>sort complete!\n");
}
}
/*用冒泡法对职工总工资排序*/
/*用插入法对职工总工资排序*
void sort2(EMP emp[],int n)
{int i,p,j;
float t;
for(i=1;i<n;i++)
{
t=emp[i].zgz;
for(p=0;p<i;p++)
if(emp[p].zgz<t)
break;
if(p==i)
continue;
for(j=i;j>p;j--)
emp[j].zgz=emp[j-1].zgz;
emp[p].zgz=t;
}
Disp(emp,n); /*显示排序后的所有记录*
printf("\n =====>sort complete!\n");
} */
/*****************************************************************************************************
主函数
*****************************************************************************************************/
void main()
{
EMP emp[N];
int n;
char s1[8],s2[8]={"123456"};
int i,k;
for(i=0;i<3;i++)
{
printf("\n请输入密码:");
gets(s1);
if(strcmp(s1,s2)==0)
break;
else
printf("\n密码错误请重新输入");
}
if(i>2)
{
printf("\n您已连续3次将用户名或密码输错,系统将退出!\n");
exit(0);
}
else
{
while(1)
{
k=displaymenu();
switch(k)
{
case '1' : add(emp,&n); break;
case '2' : Read(emp,&n);Disp(emp,n) ;break;
case '3' : Read(emp,&n);Locate(emp,n);break;
case '4' : Read(emp,&n);Modify(emp,n);;break;
case '5' : Read(emp,&n);sort(emp,n);break;
case '6' : Read(emp,&n);Tongji(emp,n); break;
case '7' : save(emp,n) ;break;
case '8' : Read(emp,&n);break;
case '9' : system("cls");printf("*******系统退出,谢谢使用********\n");exit(0);break;
default : printf("输入错误,输入必须是0~9之间的一个数字!请重新输入\n");getchar();getchar();
}
}
}
}