员工信息管理系统

运用C语言知识实现员工信息管理系统
输入5个员工的信息,每个员工含有成员名为“工号、姓名、基本工资、补贴、奖金、水电费、房租、实发工资、工资排名”,编写函数完成下列要求:
(1)输入一个员工的工号,查询该员工的信息并输出,若不存在显示没找到;
(2)输入一个新员工的信息,按工号顺序将该员工的信息插入,之后显示所有员工信息;
(3)输入一个已存在员工的姓名信息,删除该员工的信息后输出所有员工信息;
(4)修改某员工的信息(先查找某个员工,再针对某条信息进行修改);
(5)求每个员工的实发工资(实发工资=基本工资+补贴+奖金-水电费-房租),并输出;
(6)对所有员工的信息按实发工资升序排序,并输出。

#include<stdio.h>
#include<string.h>
//定义员工信息结构体 
struct Employee{
    int id;
    char name[50];
    float basesalary;
    float allowance;
    float bonus;
    float waterelectric;
    float rent;
    float actualsalary;
    int rank;
};
//输入员工结构体的函数 
void input_employees(struct Employee employees[],int n){
    for(int i=0;i<n;i++){
        printf("\n正在录入第%d位员工信息:\n",i+1);//提示当前录入的是第几个员工 
        printf("工号:");
        scanf("%d",&employees[i].id);
        printf("姓名:");
        scanf("%s",&employees[i].name);
        printf("基本工资:");
        scanf("%f",&employees[i].basesalary);
        printf("补贴:");
        scanf("%f",&employees[i].allowance);
        printf("奖金:");
        scanf("%f",&employees[i].bonus);
        printf("水电费:");
        scanf("%f",&employees[i].waterelectric);
        printf("房租:");
        scanf("%f",&employees[i].rent);
        employees[i].actualsalary=0;
        employees[i].rank=0; 
    }
}

//计算实发工资函数
void calculateactualsalary(Employee*emp){ 
    emp->actualsalary=emp->basesalary+emp->allowance+emp->bonus-emp->waterelectric-emp->rent;

 
//按实发工资排序 
void sortbyactualsalary(Employee employees[],int size){ 
    //使用冒泡排序算法 
    for(int i=0;i<size-1;i++){ 
        for(int j=0;j<size-i-1;j++) {
            if(employees[j].actualsalary>employees[j+1].actualsalary){
                Employee temp = employees[j];
                employees[j]=employees[j+1];
                employees[j+1]=temp;
            } 
        }
    }
}
//分配实发工资排名
void assignranks(Employee employees[],int size){
    for(int i=0;i<size;i++){
        int rank=1;
        //每次循环开始,将当前员工的初始排名设为1 
        for(int j=0;j<size;j++){
            if(employees[j].actualsalary<employees[i].actualsalary){
                rank++; 
            }
        }
        employees[i].rank=size-rank+1;
    }

//修改员工信息
void updateEmployee(struct Employee *emp){
    //Employee *emp 这是一个指向Employee结构提的指针,通过该指针可以直接修改所指向的Employee结构体变量的成员
    printf("\n正在录入员工信息:\n");
    printf("工号: ");
    scanf("%d",&emp->id);
    printf("姓名: ");
    scanf("%s",emp->name);
    printf("基本工资: ");
    scanf("%f",&emp->basesalary);
    printf("补贴: ");
    scanf("%f",&emp->allowance);
    printf("奖金: ");
    scanf("%f",&emp->bonus);
    printf("水电费: ") ;
    scanf("%f",&emp->waterelectric);
    printf("房租: ");
    scanf("%f",&emp->rent);
    calculateactualsalary(emp);

//插入员工信息
void insertEmployee(struct Employee employees[],int *size,struct Employee newEmp){
    /*struct Employee employees[]:这是一个 Employee 结构体类型的数组
    int *size:这是一个指向整数的指针,代表当前员工数组中实际存储的员工数量。使用指针是为了在函数内部能够修改该值并反映到函数外部
    truct Employee newEmp:这是一个 Employee 结构体类型的变量,代表要插入的新员工信息。*/
    int i;
    for (i=*size;i>0&&employees[i-1].id>newEmp.id;i--)
    {employees[i]=employees[i-1];}
        employees[i]=newEmp;
        (*size)++;
    }

//显示员工信息
void displayEmployee(struct Employee emp){
    printf("工号:%d,姓名:%s,基本工资:%.2f,补贴:%.2f,奖金:%.2f,水电费:%.2f,房租:%.2f,实发工资:%.2f,工资排名:%d\n",emp.id,emp.name,emp.basesalary,emp.allowance,emp.bonus,emp.waterelectric,emp.rent,emp.actualsalary,emp.rank);

//显示全部员工信息
void displayAllEmployees(struct Employee employees[],int size){
    if(size==0){
        printf("没有员工信息。\n");}
        else{
            printf("员工信息列表:\n");
            for(int i=0;i<size;i++){
                displayEmployee(employees[i]);
            }
        }
    }

//tang
//查询员工信息 
 int searchEmployee(struct Employee employees[],int size,int id)  
 {
     // 遍历员工数组
     for (int i = 0;i < size;i++)
     {    
         if(employees[i].id == id)
         {
         return i;

      } 
      // 若遍历完整个数组都未找到匹配的工号,则返回 -1
      }return -1;
}
 //删除员工信息 
void deleteemployee(struct Employee employees[],int *size,int index)
{
    int i;
    // 从要删除的员工索引位置开始,将后面的员工信息依次向前移动一位
    for(i = index;i < *size-1;i++) 
    { employees[i]=employees[i+1];}
    (*size)--;}

int main(){
    struct Employee employees[100];
    int size=0;
    int choice,id;
    struct Employee staff[5];
    printf("请依次输入5位员工信息:\n");
    input_employees(staff,5); 
    for(int i =0;i<5;i++){
        employees[i]=staff[i];
    }size=5;
 //jing
    while(1){
        printf("\n员工信息管理系统菜单:\n");
        printf("1.查询员工信息\n");
        printf("2.插入员工信息\n");
        printf("3.删除员工信息\n");
        printf("4.修改员工信息\n");
        printf("5.计算实发工资并显示\n");
        printf("6.按实发工资排序并显示\n");
        printf("7.退出\n");
        printf("请输入你的选择: ");
        scanf("%d",&choice);
        switch(choice){
            case 1:{
            printf("输入查询的员工工号");
            scanf("%d",&id);
            int indexByid=searchEmployee(employees,size,id);
            if(indexByid!=-1){
            displayEmployee(employees[indexByid]);    
            }else{
                printf("没有找到该员工"); 
            }break;}
            case 2:
                struct Employee newEmp;
                input_employees(&newEmp,1);
                insertEmployee(employees,&size,newEmp);
                displayAllEmployees(employees,size);
                break;
            case 3:{
            printf("请输入要删除的员工工号: ");
            scanf("%d",&id);
            int indexByName=searchEmployee(employees,size,id);
            if(indexByName !=-1){
                deleteemployee(employees,&size,indexByName);
                displayAllEmployees(employees,size);
            } else{
                printf("没找到该员工。\n");
            }break;}
            case 4:{
                printf("需修改的员工工号: ");
                scanf("%d",&id);
                int indexById=searchEmployee(employees,size,id);
                if(indexById !=-1){
                    updateEmployee(&employees[indexById]);
                displayAllEmployees(employees,size);
                }
                else{
                    printf("没有找到该员工。\n");
                }
                break;}
                    case 5://调用函数计算实发工资并输出 
                for(int i=0;i<size;i++){
                    calculateactualsalary(&employees[i]);}
                    displayAllEmployees(employees,size);
                    break;
            case 6: //按实发工资排序排名并输出 
                sortbyactualsalary(employees,size);
                assignranks(employees,size);
                displayAllEmployees(employees,size);
                break;
            case 7:
                return 0;
                default:
                    printf("无效的选择,请重新输入。\n");
    }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值