#include<setjmp.h>
#include
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
jmp_buf fanhuizhi; //定义一个跳跃用参数
struct yuangong //定义员工结构体
{
int gonghao; //工号
char name[10]; //名字
int gongzi; //基本工资
int butie; //补贴
int jiangjin; //奖金
int shuidian; //水电费
int fangzu; //房租
}xinxi[20];
void fanhuicaidan() //定义一个返回菜单的选择函数
{
int x;
printf("是否返回主菜单?是请按1,退出程序请按0并回车键确定:");
scanf("%d", &x);
switch (x)
{
case 1:longjmp(fanhuizhi, 0); break; //如果选1则跳跃回setjmp处
case 0:exit(0); break;
}
}
void search(yuangong xinxi[]) //(1)查找员工信息函数
{
int i,j=0,x;
int h;
begin1: //程序返回开始处
printf("请输入想要查询员工的工号:");
scanf("%d",&h);
for (i = 0; i < 10; i++) //判断是否有此工号
{
if (xinxi[i].gonghao==h) //如果找到文件中有此工号,输出信息
{
printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────┐\n");
printf("\t\t\t│工号 姓名 基本工资 补贴 奖金 水电 房租 │\n");
printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────┤\n");
printf("\t\t\t│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\n",
xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu);
printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────┘\n");
j=1;
}
}
if(j==0)
{
printf("此员工不存在\n");
goto begin1; //若无此工号返回重新输入
}
fanhuicaidan();
}
void add(yuangong xinxi[],int realmoney[]) //(2)添加员工信息函数
{ FILE *fp;
int x,i,j,k,m;
struct yuangong xinren; //定义新员工结构体
begin2: //程序返回开始处
printf("请以下次序输入新员工的信息\n");
printf("工号 姓名 基本工资 补贴 奖金 水电 房租\n");
scanf("%d%s%d%d%d%d%d",&xinren.gonghao, xinren.name, &xinren.gongzi,&xinren.butie,&xinren.jiangjin,&xinren.shuidian,&xinren.fangzu);
for (i = 0; i < 10; i++) //判断输入的新员工工号是否已经存在
{
if (xinren.gonghao == xinxi[i].gonghao)
{
printf("当前工号已存在,请检查后重新输入\n");
goto begin2; //如果工号已经存在,返回到开始处重新输入
}
}
if (xinren.gonghao < xinxi[0].gonghao) //小于第一个员工工号时插入到第一个位置
{
for (i = 10; i > 0; i--)
{
xinxi[i] = xinxi[i - 1];
}
xinxi[0] = xinren;
}
if (xinren.gonghao > xinxi[9].gonghao) //大于最后一个员工工号时插入到最后位置
{
xinxi[10] = xinren;
}
for (j = 0; j < 10; j++) //找到新员工工号位于哪两个之间
{
if (xinren.gonghao > xinxi[j].gonghao && xinren.gonghao < xinxi[j + 1].gonghao)
{
for (k = 10; k > j; k--)
xinxi[k] = xinxi[k - 1];
xinxi[j + 1] = xinren;
}
}
printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────┐\n");
printf("\t\t\t│工号 姓名 基本工资 补贴 奖金 水电 房租 │\n");
printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────┤\n");
for (i = 0; i < 11; i++)
{
printf("\t\t\t│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\n",xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu);
}
printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────┘\n");
}
void del(yuangong xinxi[]) //(3)删除员工信息函数
{
int x,i,j,k,m=0;
char name[20];
begin3: //程序返回开始处
printf("请输入要删除员工的名字:");
scanf("%s", name);
for (i = 0; i < 10; i++) //判断文件中有没有输入的名字并改变m的值
{
if (strcmp(name, xinxi[i].name) == 0)
m = 1;
}
if (m == 0) //通过m的值进行操作
{
printf("未找到此员工,请核实后重新输入\n");
goto begin3; //未找到员工,返回重新输入
}
else
{
for(j=0;j<10;j++)
if (strcmp(name, xinxi[j].name) == 0)
{
for (k = j; k < 9; k++)
xinxi[k] = xinxi[k + 1];
}
}
printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────┐\n");
printf("\t\t\t│工号 姓名 基本工资 补贴 奖金 水电 房租 │\n");
printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────┤\n");
for (i = 0; i < 9; i++)
{
printf("\t\t\t│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\n", xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu);
}
printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────┘\n");
}
void real(yuangong xinxi[],int realmoney[]) //(4)计算实发工资函数
{
int i,x;
printf("\n\t\t\t┌────────────────────────────────┐\n");
printf("\t\t\t│工号 姓名 实发工资 │\n");
printf("\t\t\t├────────────────────────────────┤\n");
for(i=0;i<10;i++)
printf("\t\t\t│%-9d%-12s%-11d│\n", xinxi[i].gonghao, xinxi[i].name,realmoney[i]);
printf("\t\t\t└────────────────────────────────┘\n");
printf("是否返回主菜单?是请按1,退出程序请按0并回车键确定:");
scanf("%d", &x);
switch (x)
{
case 1:longjmp(fanhuizhi, 0); break;
case 0:exit(0); break;
}
}
void rank(yuangong xinxi[], int realmoney[]) //(5)排序函数
{
int i,x, j, k, t;
struct yuangong change; //定义一个用于交换的结构体
for (i = 0; i < 9; i++) //通过冒泡法依据实发工资排序
{
for (j = 0; j < 9 - i; j++)
if (realmoney[j] > realmoney[j + 1])
{
change = xinxi[j];
xinxi[j] = xinxi[j + 1];
xinxi[j + 1] = change;
t = realmoney[j];
realmoney[j] = realmoney[j + 1];
realmoney[j + 1] = t;
}
}
printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────────────────────┐\n");
printf("\t\t\t│工号 姓名 基本工资 补贴 奖金 水电 房租 实发工资 实发工资排名│\n");
printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────────────────────┤\n");
for (i = 0; i < 10; i++)
printf("\t\t\t│%-8d%-14s%-16d%-10d%-10d%-8d%-14d%-14d%-6d│\n",
xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu, realmoney[i], i + 1);
printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────────────────────┘\n");
fanhuicaidan();
}
void main()
{
int a,i,s=0;
int realmoney[10]; //定义一个计算实发工资的数组
FILE *fp;
system("color 30"); //更换背景为湖蓝色,字体为黑色
fp = fopen("课程设计员工信息.txt", "r");
printf("\t\t ╭ ═══════■□■□═══════ ╮\n"); //菜单界面
printf("\t\t │ 员工信息管理系统 │\n");
printf("\t\t ╰ ═══════■□■□═══════ ╯\n");
printf("\t\t ┌─────────────—──────────—-┐\n");
printf("\t\t │ 1. 查询信息 2. 添加员工 │\n");
printf("\t\t │ │\n");
printf("\t\t │ 3. 删除信息 4. 实发工资 │\n");
printf("\t\t │ │\n");
printf("\t\t │ 5. 工资排名 0. 退出程序 │\n");
printf("\t\t │ │\n");
printf("\t\t └─────────────—──────────—-┘\n");
if (setjmp(fanhuizhi)) //longjum跳到此处
{
fclose(fp);
goto begin;
}
{
for (i = 0; i < 10; i++)
fscanf(fp, "%d%s%d%d%d%d%d", &xinxi[i].gonghao, xinxi[i].name, &xinxi[i].gongzi, &xinxi[i].butie, &xinxi[i].jiangjin, &xinxi[i].shuidian, &xinxi[i].fangzu);
for (i = 0; i < 10; i++)
realmoney[i] = xinxi[i].gongzi + xinxi[i].jiangjin + xinxi[i].butie - xinxi[i].shuidian - xinxi[i].fangzu; //计算实发工资
begin:
printf("\t\t请您选择(0-5):"); //程序返回开始处
scanf("%d", &a); //序号选择
if (a >= 0 && a <= 5) //判断序号是否合法
{
switch (a)
{
case 0:exit(0); break;
case 1:search(xinxi);system("pause"); break;
case 2:add(xinxi,realmoney); fprintf(fp, "%d%s%d%d%d%d%d", &xinxi[i].gonghao, xinxi[i].name, &xinxi[i].gongzi, &xinxi[i].butie, &xinxi[i].jiangjin, &xinxi[i].shuidian, &xinxi[i].fangzu); system("pause"); break;
case 3:del(xinxi);fprintf(fp, "%d%s%d%d%d%d%d", &xinxi[i].gonghao, xinxi[i].name, &xinxi[i].gongzi, &xinxi[i].butie, &xinxi[i].jiangjin, &xinxi[i].shuidian, &xinxi[i].fangzu); system("pause"); break;
case 4:real(xinxi, realmoney); system("pause"); break;
case 5:rank(xinxi, realmoney); system("pause"); break;
}
}
else
{
printf("\t\t请输入正确的功能序号\n");
goto begin; //序号错误程序跳回输出序号处
}
}
system("pause");
}