#include <stdio.h>
#include <stdlib.h>
#include "string.h"
// 创建员工的结构体
struct emp {
int num;// 编号
char name[10];// 员工姓名
int base;// 基础工资
int bonus;// 奖金
int over;// 加班工资
int total;// 总工资
};
struct employee{
int num;
char name[10];
int base;
int bonus;
int over;
int total;
};
void sort(struct employee *emp,int len){
for (int i = 0; i < len-1; ++i) {
for (int j = 0; j < len-1-i; ++j){
if (emp[j].total > emp[j + 1].total) {
struct employee temp;
temp = emp[j];
emp[j] = emp[j + 1];
emp[j + 1] = temp;
}
}
}
}
//冒泡排序员工按工资大小排
void bubbleSort(struct emp *pEmp, int len)
{
int i,j;
for(i=0;i<len-1;i++)
{for(j=0;j<len-1-i;j++)
{if(pEmp[j].total > pEmp[j+1].total) //把员工按总工资排序
{
struct emp temp=pEmp[j];
pEmp[j] = pEmp[j+1];
pEmp[j+1] = temp;
}
}
}
}
void print(struct employee *emp,int len){
printf("num name base bonus over");
for (int i = 0; i < len; ++i) {
printf("%d %s %d %d %d",emp[i].num,emp[i].name,emp[i].base,emp[i].bonus,emp[i].over);
}
}
//打印员工信息
void printfArray(struct emp *pEmp, int len)
{
for(int i=0;i<len;i++)
{
printf("员工编号: %d\t员工姓名: %s\t基础工资: %d\t奖金: %d\t加班工资: %d\n",
pEmp[i].num, pEmp[i].name, pEmp[i].base, pEmp[i].bonus, pEmp[i].over);
}
}
void overprint(struct employee *emp,int len){
int max=0;
int min=0;
for (int i = 1; i < len; ++i) {
if (emp[max].over < emp[i].over)
max=i;
if (emp[min].over > emp[i].over)
min=i;
}
printf("the max over employee information:\n");
printf("%d %s %d %d %d\n",emp[max].num,emp[max].name,emp[max].base,emp[max].bonus,emp[max].over);
printf("the min over employee information:\n");
printf("%d %s %d %d %d\n",emp[min].num,emp[min].name,emp[min].base,emp[min].bonus,emp[min].over);
}
// 输出加班工资最少和最多的人的编号和姓名
void fun2(struct emp *pEmp, int len)
{
int max=pEmp[0].over;
int min=pEmp[0].over;
struct emp maxEmp = pEmp[0], minEmp = pEmp[0]; //方便输出
for(int i=0;i<len;i++)
{
if(max<pEmp[i].over)
{
max=pEmp[i].over;
maxEmp=pEmp[i];
}
if(min>pEmp[i].over)
{
min=pEmp[i].over;
minEmp=pEmp[i];
}
}
printf("\n--------------------------------------------------------------------------------------------------------------------\n");
printf("加班工资最多的 员工编号: %d\t员工姓名: %s\t基础工资: %d\t奖金: %d\t加班工资: %d\n", maxEmp.num, maxEmp.name, maxEmp.base, maxEmp.bonus, maxEmp.over);
printf("加班工资最少的 员工编号: %d\t员工姓名: %s\t基础工资: %d\t奖金: %d\t加班工资: %d\n", minEmp.num, minEmp.name, minEmp.base, minEmp.bonus, minEmp.over);
}
void nameprint(struct employee *emp,int len){
char name[10];
printf("please input a name:\n");
scanf("%s",&name);
for (int i = 0; i < len; ++i) {
if (strcmp(name,emp[i].name)==0)
printf("%d %s %d %d %d",emp[i].num,emp[i].name,emp[i].base,emp[i].bonus,emp[i].over);
}
}
// 根据输入的员工姓名输出员工信息
void fun3(struct emp *pEmp, int len)
{
char name[10];
printf("\n请输入员工姓名:\n");
scanf("%s",&name);
for(int i=0;i<len;i++)
{
if(strcmp(name,pEmp[i].name)==0) //名字一样
{
printf("\n员工编号: %d\t员工姓名: %s\t基础工资: %d\t奖金: %d\t加班工资: %d\n", pEmp[i].num, pEmp[i].name, pEmp[i].base, pEmp[i].bonus, pEmp[i].over);
}
}
}
int main()
{
FILE *fp;
fp=fopen("Salary.txt", "r");
if (fp==NULL)
{
printf("error!");
return 0;
}
struct emp emps[200];//先建一个员工结构体数组类型
int index=0; //数组索引下标
while(!feof(fp))// 只要文件里还有内容就循环读取,标准写法
{
struct emp obj;
fscanf(fp, "%d%s%d%d%d", &obj.num, obj.name, &obj.base, &obj.bonus, &obj.over);//读取文件
obj.total=obj.base+obj.bonus+obj.over;
emps[index++]=obj;
}
bubbleSort(emps, index);// 对员工数组进行排序
printfArray(emps, index);// 打印员工信息
fun2(emps, index);// 2 输出加班工资最少和最多的人的编号和姓名
fun3(emps, index);// 3 根据输入的员工姓名输出员工信息
return 0;
}
/*2021第三题
*Salary.txt 中有 200 条员工记录,格式如下:
员工编号 员工姓名 基础工资 奖金 加班工资
1 李明 2000 1500 800
2 小红 1800 1000 900
3 小张 2200 1200 800
4 张杰 2500 1000 1000
实现以下功能:
(1)读取文件,并按照总工资(基础工资+奖金+加班工资)从小到大的顺序输出员工信息
(2)输出加班工资最少和最多的人的编号和姓名
(3)根据输入的员工姓名输出员工信息,考虑重复情况