输入10个员工的信息,每个员工含有成员名为“工号、姓名、基本工资、补贴、奖金、水电费、房租、实发工资、工资排名”,分别编写五个函数求:
(1)输入一个员工的工号,查询该员工的信息并输出,若不存在显示没找到。
(2)输入一个新员工的信息,按工号顺序将该员工的信息插入后输出。
(3)输入一个已存在员工的姓名信息,删除该员工的信息后输出。
(4)求每个员工的实发工资(实发工资=基本工资+补贴+奖金-水电费-房租);
(5)对所有员工的信息按实发工资升序排序,并填写工资排名后输出;
要求:
10个员工的数据用文件存储,每个员工的结构体用数组。当程序执行后先显示“菜单”,当输入为1时,执行第(1)个函数;当输入为2时,执行第(2)个函数;当输入为3时,执行第(3)个函数;当输入为4时,执行第(4)个函数;当输入为5时,执行第(5)个函数;当输入为0时,退出系统,当输入其他数字时,提示输入有错误。
代码如下
#include <stdio.h>
#include <string.h>
#include <process.h>
//最大的员工数量,可以根据实际调整
#define MAXNMB 20
//定义员工结构体,用于存放员工数据
struct Employee
{
int id; //工号
char name[20]; //姓名
int baseGz; //基本工资
int bt; //补贴
int jiangjin; //奖金
int shuidian; //水电费
int fangzu; //房租
int real; //是发工资
int rank; //排名
};
//显示所有员工信息
void display(struct Employee a[],int n)
{
int i;
printf("工号 姓名 基本工资 补贴 奖金 水电费 房租\n");
for (i=0;i<n;i++)
{
printf("%d %s %d %d %d %d %d\n",a[i].id,a[i].name,a[i].baseGz,a[i].bt,a[i].jiangjin,a[i].shuidian,a[i].fangzu);
}
}
//根据工号排序
void SortByGh(struct Employee a[],int n)
{
int i,j;
struct Employee tt;
//采用冒泡排序法按照工号从小到大排序
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
{
if (a[j].id > a[j+1].id)
{
tt = a[j];
a[j] = a[j+1];
a[j+1] = tt;
}
}
}
}
//读取文件
void ReadFile(char* filename,struct Employee a[],int *n)
{
FILE* fp;
int i = 0;
char buf[100]={0}; //临时缓冲区,读取第一行的注释
if((fp= fopen(filename,"r")) == 0)
{
printf("文件打开失败\n");
return ;
}
fgets(buf,100,fp); //读取开头的注释
//逐行读取文件,并将字段数据存入结构体数组
while(!feof(fp))
{
fscanf(fp,"%d %s %d %d %d %d %d\n",&a[i].id,a[i].name,&a[i].baseGz,&a[i].bt,&a[i].jiangjin,&a[i].shuidian,&a[i].fangzu);
if(a[i].id > 0) //去掉空行的影响
i++;
}
fclose(fp);
*n = i; //记录数组中实际的员工个数
display(a,*n);//显示读取后的数据
}
//1.查找信息
void Find(struct Employee a[],int n)
{
int id,i;
system("cls");
printf("请输入需要查找的工号:");
scanf("%d",&id);
for (i=0;i<n;i++)
{
if (a[i].id == id) //如果工号相等,说明找到需要查找的员工
{
printf("工号:%d\n",a[i].id);
printf("姓名:%s\n",a[i].name);
printf("基本工资:%d\n",a[i].baseGz);
printf("补贴:%d\n",a[i].bt);
printf("奖金:%d\n",a[i].jiangjin);
printf("水电费:%d\n",a[i].shuidian);
printf("房租:%d\n",a[i].fangzu);
//printf("实发工资:%d\n",a[i].real);
break;
}
}
if (i == n)
{
printf("未找到该员工\n");
}
system("pause");
}
//2.插入新员工
void Insert(struct Employee a[],int *n)
{
struct Employee tt;
int i,j;
system("cls");
printf("请输入新员工的工号:");
while(1)
{
scanf("%d",&tt.id);
//查找是否已经存在
for (i=0;i<*n;i++)
{
if(a[i].id == tt.id)
{
printf("该工号已经被使用,请重新输入:");
break;
}
}
if(i == *n) //说明该工号可以使用
break;
}
printf("请输入新员工的姓名: ");
scanf("%s",tt.name);
printf("请输入新员工的基本工资:");
scanf("%d",&tt.baseGz);
printf("请输入新员工的补贴:");
scanf("%d",&tt.bt);
printf("请输入新员工的奖金:");
scanf("%d",&tt.jiangjin);
printf("请输入新员工的水电费:");
scanf("%d",&tt.shuidian);
printf("请输入新员工的房租:");
scanf("%d",&tt.fangzu);
//插入
for (i = 0;i<*n;i++)
{
//因为开始的时候已经按照工号从小到大排序了,所以此处找到比插入的工号大的位置
if(tt.id < a[i].id )
{
//将原来的数据后移一位
for (j=*n;j>i;j--)
{
a[j] = a[j-1];
}
//在找到的位置插入新员工信息
a[i] = tt;
}
}
//如果数组中所有员工的工号都比新员工的员工号小,就把新员工的信息插入到数组的最后
if(i == *n)
{
a[*n] = tt;
}
*n = *n +1;//数组的大小+1
printf("插入成功\n");
display(a,*n);
system("pause");
}
//3.删除员工
void Dele(struct Employee a[],int *n)
{
int i,j;
char name[20]={0};
system("cls");
printf("请输入需要删除的姓名:");
scanf("%s",name);
for (i=0;i<*n;i++)
{
if (strcmp(name,a[i].name) == 0) //找到名字符合的员工
{
//将数组中的元素前移一位(用后面的元素把这个元素覆盖掉)
for (j=i;j<*n-1;j++)
{
a[j] = a[j+1];
}
*n = *n -1; //数组中元素的实际个数减一
printf("删除成功\n");
display(a,*n); //显示删除后的员工信息
break;
}
}
if(i == *n)
printf("未找到该员工\n");
system("pause");
}
//4.求实发工资
void Real(struct Employee a[],int n)
{
int i=0;
system("cls");
printf("实发工资如下:\n");
//遍历数组,计算员工的实发工资
for (i=0;i<n;i++)
{
a[i].real = a[i].baseGz + a[i].bt + a[i].jiangjin - a[i].shuidian - a[i].fangzu;
printf("工号:%d 姓名:%s 实发工资:%d\n",a[i].id,a[i].name,a[i].real);
}
system("pause");
}
//5.根据实发工资排名
void SortByReal(struct Employee a[],int n)
{
int i,j;
struct Employee tt;
//使用冒泡排序根据员工的实发工资排序,实发工资从小到大排序
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
{
if(a[j].real > a[j+1].real)
{
tt = a[j];
a[j] = a[j+1];
a[j+1] = tt;
}
}
}
//计算排名
j = 1;
a[n-1].rank = 1;
//因为实发工资升序排列,所以排名按照逆序遍历,实发工资最多的排名第一
for (i = n-2;i>=0;i--)
{
if (a[i].rank == a[i+1].rank)//如果第i员工的实发工资与第i+1个员工的实发工资相同,那么他们的排名相同
{
a[i].rank = j;
}else
{
//如果第i员工的实发工资与第i+1个员工的实发工资不相同,那么第i个员工的排名+1
j++;
a[i].rank = j;
}
}
//显示
printf("实发工资排名:\n");
printf("工号 姓名 实发工资 排名\n");
for (i = 0;i<n;i++)
{
printf("%d %s %d %d\n",a[i].id,a[i].name,a[i].real,a[i].rank);
}
system("pause");
}
//6.保存到文件
void WriteFile(char* filename,struct Employee a[],int n)
{
int i;
FILE* fp;
if((fp = fopen(filename,"w")) == 0)
{
printf("文件打开失败\n");
return ;
}
fprintf(fp, "工号 姓名 基本工资 补贴 奖金 水电费 房租\n");
for (i=0;i<n;i++)
{
fprintf(fp,"%d %s %d %d %d %d %d\n",a[i].id,a[i].name,a[i].baseGz,a[i].bt,a[i].jiangjin,a[i].shuidian,a[i].fangzu);
}
fclose(fp);
printf("文件保存成功\n");
system("pause");
}
int main()
{
struct Employee a[MAXNMB]; //保存所有员工数据
int nmbReal = 0;//实际员工数量
int opt =0;
int bgo = 1;
//从文件中读取数据到结构体数组a,nmbReal是实际读取的员工信息个数
ReadFile("file.txt",a,&nmbReal);
while(bgo)
{
system("cls");
printf("---------------员工管理系统---------------\n");
printf("| 1.查询员工信息 |\n");
printf("| 2.添加新员工 |\n");
printf("| 3.删除员工 |\n");
printf("| 4.求实发工资 |\n");
printf("| 5.根据实发工资排名 |\n");
printf("| 0.退出系统 |\n");
printf("------------------------------------------\n");
scanf("%d",&opt);
switch(opt)
{
case 1:
Find(a,nmbReal);//查询员工信息
break;
case 2:
Insert(a,&nmbReal);//添加新员工
break;
case 3:
Dele(a,&nmbReal);//删除员工
break;
case 4:
Real(a,nmbReal);//计算每个员工的实发工资
break;
case 5:
SortByReal(a,nmbReal);//根据实发工资排名
break;
case 0:
bgo = 0; //退出程序
WriteFile("file2.txt",a,nmbReal);//退出前保存文件,如果需要保存到原文件,把文件名修改为file.txt
break;
default:
system("cls");
printf("输入错误,没有该操作!!"); //没有对应的操作选项,提示输入错误
system("pause");
break;
}
}
}
晚上可以写,白天时间不够,应该百度一下找个相似的改改就行了
还要删除和添加信息后要保存数据到文件