工资管理管理系统:用c语言编写

题目要求:输入职工信息(至少10条记录),提供新增,删除,修改,和显示功能


#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define N 100
struct GongZi
{
    int num;      //员工工号; 
    char name[20];        //员工姓名; 
    float jbgz;            //基本工资; 
    float jt;            //津贴; 
    float gt;            //岗贴; 
    float bt;            //补贴; 
    float ft;            //房贴; 
    float jtbt;            //交通补贴; 
    float sfgz;            //实发工资; 
    float sh;            //税收; 
    float zzgz;            //最终工资; 
}Yuan,yuan[N];

char filename[100]={"员工工资管理.txt"};     //储存员工的信息; 
FILE *fp;                            //文件指针; 
void Gongz();    //职工个人所得税计算模块; 
void Tianj();        //添加职工的工资信息模块; 
void Chax();        //职工工资查询模块; 
void Xiug();        //职工工资修改模块; 
void Tongji();        //职工工资统计模块; 
void Try_again();    //输入错误重试模块; 
void Menu();        //主菜单; 
void zhuijia();        //追加添加职工信息;
void Shanchu();     //删除职工的信息; 
int main(void)
{
    Menu();
    return 0;
}
void Menu()                //主菜单; 
{
    printf("=====================================\n");
    printf("|     (1)职工个人所得税的计算       |\n");
    printf("|     (2)职工工资录入               |\n");
    printf("|     (3)添加职工信息               |\n"); 
    printf("|     (4)职工工资查询               |\n");
    printf("|     (5)删除职工信息               |\n");
    printf("|     (6)职工工资修改               |\n");
    printf("|     (7)职工工资统计               |\n");
    printf("|     (0)退出程序                   |\n");
    printf("=====================================\n");
    
    
    int n;
    scanf("%d",&n);
    switch(n)
    {
        case 0: exit(0);
        case 1: Gongz();   break;
        case 2: Tianj();   break;
        case 3: zhuijia();  break;
        case 4: Chax();    break;
        case 5: Shanchu(); break;
        case 6: Xiug();    break;
        case 7: Tongji();    break;
        default: Try_again(); break;
    } 
}

void Tianj()                    //信息录入; 
{
    int select;
    fp=fopen(filename,"wb+");
    if(fp==NULL)
    {
        printf("打开文件夹失败:\n");
        exit(1);
    } 
    printf("******************请输入员工信息*******************\n");
    printf("输入员工编号:");
    scanf("%d",&Yuan.num);
    printf("输入员工姓名:");
    scanf("%s",Yuan.name);
    printf("输入员工的基本工资:"); 
    scanf("%f",&Yuan.jbgz);
    printf("津贴:");
    scanf("%f",&Yuan.jt);
    printf("岗贴:");
    scanf("%f",&Yuan.gt); 
    printf("房贴:");
    scanf("%f",&Yuan.ft);
    printf("补贴:");
    scanf("%f",&Yuan.bt);
    printf("交通补贴:");
    scanf("%f",&Yuan.jtbt);
    Yuan.sfgz=Yuan.jbgz+Yuan.jt+Yuan.gt+Yuan.ft+Yuan.bt+Yuan.ft;
    printf("实发工资:%f",Yuan.sfgz);
    printf("\n");
    fwrite(&Yuan,sizeof(struct GongZi),1,fp); 
    
    printf("*****(1)继续录入*****(2)主菜单**********\n");            //在这里进行选择,是否进行录入还是选择返回主菜单; 
    printf("请输入你的选择[ ]\b\b");    
    scanf("%d",&select);
    while(1)
    {
        if(select==2)
        {
            fclose(fp);
            system("cls"); 
            Menu();
        }
        else if(select==1) 
        {    
            fclose(fp);
            system("cls");
            zhuijia();
        }
        else
        {
            printf("输入错误,请重新输入[ ]\b\b");
            scanf("%d",&select);
        }    
    } 
}
/*添加职工信息,跟功能2唯一区别,该功能是从利用文件追加进行输入*/ 
void zhuijia()
{
    int select;
    fp=fopen(filename,"ab+");
    if(fp==NULL)
    {
        printf("打开文件夹失败:\n");
        exit(1);
    } 
    printf("******************请输入员工信息*******************\n");
    printf("输入员工编号:");
    scanf("%d",&Yuan.num);
    printf("输入员工姓名:");
    scanf("%s",Yuan.name);
    printf("输入员工的基本工资:"); 
    scanf("%f",&Yuan.jbgz);
    printf("津贴:");
    scanf("%f",&Yuan.jt);
    printf("岗贴:");
    scanf("%f",&Yuan.gt); 
    printf("房贴:");
    scanf("%f",&Yuan.ft);
    printf("补贴:");
    scanf("%f",&Yuan.bt); 
    printf("交通补贴:");
    scanf("%f",&Yuan.jtbt);
    Yuan.sfgz=Yuan.jbgz+Yuan.jt+Yuan.gt+Yuan.ft+Yuan.bt+Yuan.ft;
    printf("实发工资:%f",Yuan.sfgz);
    
    printf("\n");
    fwrite(&Yuan,sizeof(struct GongZi),1,fp); 
    
    printf("*****(1)继续录入*****(2)主菜单**********\n");
    printf("请输入你的选择[ ]\b\b");
    scanf("%d",&select);
    while(1)
    {
        if(select==2)
        {
            fclose(fp); 
            system("cls");
            Menu();
        }
        else if(select==1) 
        {    
            fclose(fp);
            system("cls");
            zhuijia();
        }
        else
        {
            printf("输入错误,请重新输入[ ]\b\b");
            scanf("%d",&select);
        }
    }
    
}

/*实发工资如果在5000以内则税收为实发工资的5%;
    5000~10000则超过5000的部分乘以10%;剩下的按5%计算;
    10000以上则超过10000的按15%计算,5000~10000部分则按10%计算,5000部分则按5%计算;*/ 

void Gongz()
{
    int n,y=0,select;
    printf("请输入员工的编号:");
    scanf("%d",&n);
    fp=fopen(filename,"ab+"); 
    if(fp==NULL)
    {
        printf("打开文件夹失败:\n");
        exit(1);
    } 
    while(fread(&Yuan,sizeof(struct GongZi),1,fp))
    {
        if(n==Yuan.num)
        {
            if(Yuan.sfgz<5000)
            {
                Yuan.sh=Yuan.sfgz*0.05;
                Yuan.zzgz=Yuan.sfgz-Yuan.sh;
            }
            else if(Yuan.sfgz>5000&&Yuan.sfgz<10000)
            {
                Yuan.sh=(Yuan.sfgz-5000)*0.1+5000*0.05;
                Yuan.zzgz=Yuan.sfgz-Yuan.sh;
            }
            else 
            {
                Yuan.sh=(Yuan.sfgz-10000)*0.15+5000*0.1+5000*0.05;
                Yuan.zzgz=Yuan.sfgz-Yuan.sh;
            }
            y=1;
            break;
        }
    }
    if(y==1)
    {
        printf("员工编号:%d 员工姓名:%s  税收:%0.2f  最终工资:%0.2f\n",Yuan.num,Yuan.name,Yuan.sh,Yuan.zzgz);        
    }
    else
    {        
        printf("查无此人!!!\n");
        
    }
    printf("*****(1)继续查询*****(2)主菜单**********\n");
    printf("请输入你的选择[ ]\b\b");
    scanf("%d",&select);
    while(1)
    {
        if(select==2)
        {
            fclose(fp);
            system("cls"); 
            Menu();
        }
        else if(select==1) 
        {    
            fclose(fp);
            system("cls");
            Gongz();
        }
        else
        {
            printf("输入错误,请重新输入[ ]\b\b");
            scanf("%d",&select);
        }
        
    
    }
    
 
     
}
/*查询职工信息,通过职工编号遍历寻找*/ 
void Chax()
{
        int n,y=0,select;
    printf("请输入员工的编号:");
    scanf("%d",&n);
    fp=fopen(filename,"ab+"); 
    if(fp==NULL)
    {
        printf("打开文件夹失败:\n");
        exit(1);
    } 
    while(fread(&Yuan,sizeof(struct GongZi),1,fp))
    {
        if(n==Yuan.num)
        {
            
            printf("员工编号:%07d 姓名:%s 基本工资:%0.2f 津贴:%0.2f 岗贴:%0.2f 补贴:%0.2f 房贴:%0.2f 交通补贴:%0.2f 实发工资:%0.2f\n\n",
            Yuan.num,Yuan.name,Yuan.jbgz,Yuan.jt,Yuan.gt,Yuan.bt,Yuan.ft,Yuan.jtbt,Yuan.sfgz); 
            y=1; 
            break;
        }
    }
    if(y!=1)
    {
        printf("查无此人!!!\n");
    }
            
    printf("*****(1)继续查询*****(2)主菜单**********\n");
    printf("请输入你的选择[ ]\b\b");
    scanf("%d",&select);
    while(1)
    {
        if(select==2)
        {
            fclose(fp);
            system("cls"); 
            Menu();
        }
        else if(select==1) 
        {    
            fclose(fp);
            system("cls");
            Chax();
        }
        else
            scanf("%d",&select);
    
    }
    
}

//修改员工的信息; 
void Xiug()
{
    int i=0,j,k,numb,y=0,select;
    fp=fopen(filename,"rb+");
    
    if(fp==NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
    
    while(fread(&Yuan,sizeof(struct GongZi),1,fp))            //用结构体数组储存文件中的员工信息 
    {
        yuan[i++]=Yuan;
    }
    for(j=0;j<i-1;j++)                                        //按员工的编号从小到大排序 
    {
        for(k=j+1;k<i;k++)
        {
            if(yuan[j].num>yuan[k].num)
            {
                Yuan=yuan[j];
                yuan[j]=yuan[k];
                yuan[k]=Yuan;
                
            } 
        }
    }
    
    printf("请输入您要修改的员工编号:");                    //输入要修改的编号 
    scanf("%d",&numb);
    for(j=0;j<i;j++)                                        //通过遍历寻找到目标编号; 
    {
        if(numb==yuan[j].num)
        {
            printf("员工编号:%07d 姓名:%s 基本工资:%0.2f 津贴:%0.2f 岗贴:%0.2f 补贴:%0.2f 房贴:%0.2f 交通补贴:%0.2f 实发工资:%0.2f",yuan[j].num,
                yuan[j].name,yuan[j].jbgz,yuan[j].jt,yuan[j].gt,yuan[j].bt,yuan[j].ft,yuan[j].jtbt,yuan[j].sfgz);
            printf("\n\n"); 
            printf("******************请输入你要修改的员工信息*******************\n");
            printf("输入员工姓名:");
            scanf("%s",yuan[j].name);
            printf("输入员工的基本工资:"); 
            scanf("%f",&yuan[j].jbgz);
            printf("津贴:");
            scanf("%f",&yuan[j].jt);
            printf("岗贴:");
            scanf("%f",&yuan[j].gt); 
            printf("房贴:");
            scanf("%f",&yuan[j].ft);
            printf("补贴:");
            scanf("%f",&yuan[j].bt);
            printf("交通补贴:");
            scanf("%f",&yuan[j].jtbt);
            yuan[j].sfgz=yuan[j].jbgz+Yuan.jt+yuan[j].gt+yuan[j].ft+yuan[j].bt+yuan[j].ft;
            printf("实发工资:%f",yuan[j].sfgz);
            printf("\n");
            y=1;
        } 
    }
    if(y==1)                                            //通过y的值来判断是否修改成功; 
        printf("修改成功!\n\n");
    else
        printf("查无此人!!!\n\n");
        
        
    rewind(fp);                                //把文件指针指向开头 
    for(j=0;j<i;j++)                        //重新把结构体数组写进文件; 
    {
        fwrite(&yuan[j],sizeof(struct GongZi),1,fp);
    }
    
    
                
    printf("*****(1)继续修改*****(2)主菜单**********\n");
    printf("请输入你的选择[ ]\b\b");
    scanf("%d",&select);
    while(1)
    {
        if(select==2)
        {
            fclose(fp);
            system("cls"); 
            Menu();
        }
        else if(select==1) 
        {    
            fclose(fp);
            system("cls");
            Xiug();
        }
        else
            scanf("%d",&select);
    
    }
    
}

void Tongji()
{
    int i=0,j,k;   //统计人数; 
    float sfzgz=0,dsr=0,zsr=0,gsr=0;            //统实发总工资、低收入,中收入,高收入; 
    fp=fopen(filename,"rb+");
    
    if(fp==NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
     
    
    printf("员工编号   姓名   基本工资  津贴   岗贴   补贴   房贴   交通补贴  实发工资\n"); 
    
    while(fread(&Yuan,sizeof(struct GongZi),1,fp))
    {
        yuan[i++]=Yuan;
    }
    for(j=0;j<i-1;j++)
    {
        for(k=j+1;k<i;k++)
        {
            if(yuan[j].num>yuan[k].num)
            {    
                Yuan=yuan[j];
                yuan[j]=yuan[k];
                yuan[k]=Yuan;
                
            } 
        }
    }
    for(j=0;j<i;j++)
    {
        if(yuan[j].sfgz<5000)
            dsr++;
        else if(yuan[j].sfgz>5000&&yuan[j].sfgz<10000)
                zsr++;
        else
            gsr++;
            
        sfzgz+=yuan[j].sfgz;    
        
        printf("%07d   %s  %5.2f   %4.2f  %4.2f  %4.2f  %4.2f  %4.2f  %4.2f",yuan[j].num,
        yuan[j].name,yuan[j].jbgz,yuan[j].jt,yuan[j].gt,yuan[j].bt,yuan[j].ft,yuan[j].jtbt,yuan[j].sfgz);
        printf("\n\n");    
    }
    printf("员工总人数:%d 实发总工资:%0.2f\n\n",i,sfzgz);
    printf("低收入人群占比%0.2f%%\n\n",(dsr/i)*100);
    printf("中等收入人群占比%0.2f%%\n\n",(zsr/i)*100);
    printf("高收入人群占比%0.2f%%\n\n",(gsr/i)*100);
    fclose(fp);
    printf("按任意键返回主菜单\n"); 
    system("pause");
    system("cls");
    Menu();
    
}

/*删除职工信息,把员工的信息删除后,后面的数据会替代前面的数据,达到删除的功能*/ 
void Shanchu()
{
    int numb,i=0,j,k,select,y=0,t;
    fp=fopen(filename,"rb+");
    if(fp==NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
    while(fread(&Yuan,sizeof(struct GongZi),1,fp))            //用结构体数组储存文件中的员工信息 
    {
        yuan[i++]=Yuan;
    }
    for(j=0;j<i-1;j++)                                        //按员工的编号从小到大排序 
    {
        for(k=j+1;k<i;k++)
        {
            if(yuan[j].num>yuan[k].num)
            {
                Yuan=yuan[j];
                yuan[j]=yuan[k];
                yuan[k]=Yuan;
                
            } 
        }
    }
    
    printf("请输入你要删除的员工编号:");
    scanf("%d",&numb); 
    for(j=0;j<i;j++)
    {
        if(yuan[j].num==numb)
        {
            printf("员工编号:%07d 姓名:%s 基本工资:%0.2f 津贴:%0.2f 岗贴:%0.2f 补贴:%0.2f 房贴:%0.2f 交通补贴:%0.2f 实发工资:%0.2f\n\n",
            yuan[j].num,yuan[j].name,yuan[j].jbgz,yuan[j].jt,yuan[j].gt,yuan[j].bt,yuan[j].ft,yuan[j].jtbt,yuan[j].sfgz); 
            
            
            printf("按 1 删除,按其他数字键取消删除\n\n");
            
            scanf("%d",&t);
            if(t!=1)
            {
                system("cls"); 
                Menu();
                break;
            }
            for(k=j;k<i;k++)            //后面的结构体往前面移动;                                
            {
                yuan[k]=yuan[k+1];
            }
            y++; 
        }
    
    }
    if(y==0)
        printf("查无此人!!!\n");
    else
        printf("删除成功!\n\n");
            
    fclose(fp);                            //这里选择先将文件关闭,再重新用 wb 从头开始写进去 
    fp=fopen(filename,"wb+");
    if(fp==NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
                                
    for(j=0;j<i-y;j++)                        //重新把结构体数组写进文件,这里要减掉删除的那个数; 
    {
        fwrite(&yuan[j],sizeof(struct GongZi),1,fp);
    }            
    
    printf("*****(1)继续删除*****(2)主菜单**********\n");
    printf("请输入你的选择[ ]\b\b");
    scanf("%d",&select);
    while(1)
    {
        if(select==2)
        {
            fclose(fp);
            system("cls"); 
            Menu();
        }
        else if(select==1) 
        {    
            fclose(fp);
            system("cls");
            Shanchu();
        }
        else
            scanf("%d",&select);
    
    }
 } 

/*当用户输出其他数字时,无法进行其他操作,可以利用此函数让用户重新输入*/ 
void Try_again()
{
    int n;
    printf("输入错误:请重新输入!!!\n");
    printf("请再次输入您的选择[ ]\b\b");
    scanf("%d",&n);
    switch(n)
    {
        case 0: exit(0);
        case 1: Gongz();   break;
        case 2: Tianj();   break;
        case 3: zhuijia();  break;
        case 4: Chax();    break;
        case 5: Shanchu(); break;
        case 6: Xiug();    break;
        case 7: Tongji();    break;
        default: Try_again(); break;
    } 
}

需要用链表还是结构体数组?
下面的代码是最简单的工资计算形式,如需链表形式,可在下方回复。代码如下:

img

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define MAXNMB 200
typedef struct _employee
{
    int id; //员工编号
    char name[20];
    float solary; //基本工资
    float ks;  //扣税
    float jx; //绩效
    float bt; //补贴
}Employee;


//录入功能
void input(Employee a[], int* nmb)
{
    system("cls");
    printf("请输入员工编号:");
    scanf("%d", &a[*nmb].id);
    printf("请输入员工姓名:");
    scanf("%s", a[*nmb].name);
    printf("请输入员工工资:");
    scanf("%f", &a[*nmb].solary);

    printf("请输入扣税金额:");
    scanf("%f", &a[*nmb].ks);
    printf("请输入绩效工资:");
    scanf("%f", &a[*nmb].jx);
    printf("请输入补贴:");
    scanf("%f", &a[*nmb].bt);


    *nmb += 1;
    printf("添加成功!\n");
    system("pause");
}

//删除
void dele(Employee a[], int* nmb)
{
    int id;
    int i, j;
    system("cls");
    printf("请输入需要删除的员工编号:");
    scanf("%d", &id);
    for (i = 0; i < *nmb; i++)
    {
        if (a[i].id == id)
        {
            for (j = i; j < *nmb - 1; j++)
                a[j] = a[j + 1];
            *nmb -= 1;
            printf("删除成功!\n");
            system("pause");
            return;
        }
    }
    printf("未找到该员工,删除成功!\n");
    system("pause");
}

//修改
void Mod(Employee a[], int nmb)
{
    int id;
    int i;
    system("cls");
    printf("请输入需要修改的员工编号:");
    scanf("%d", &id);
    for (i = 0; i < nmb; i++)
    {
        if (a[i].id == id)
        {
            printf("请输入员工编号:");
            scanf("%d", &a[i].id);
            printf("请输入员工姓名:");
            scanf("%s", a[i].name);
            printf("请输入员工工资:");
            scanf("%f", &a[i].solary);

            printf("请输入扣税金额:");
            scanf("%f", &a[i].ks);
            printf("请输入绩效工资:");
            scanf("%f", &a[i].jx);
            printf("请输入补贴:");
            scanf("%f", &a[i].bt);

            printf("修改成功!\n");
            system("pause");
            return;
        }
    }
    printf("未找到该员工,修改成功!\n");
    system("pause");
}

//显示
void showAll(Employee a[], int nmb)
{
    int i;
    system("cls");
    printf("员工信息如下:\n");
    printf("员工编号    员工姓名    基本工资    扣税金额   绩效工资   补贴\n");
    printf("------------------------------------------\n");
    for (i = 0; i < nmb; i++)
    {
        printf("%8d  %20s  %8.2f  %8.2f  %8.2f  %8.2f\n", a[i].id, a[i].name, a[i].solary,a[i].ks,a[i].jx,a[i].bt);
    }
    system("pause");
}


//查询
void search(Employee a[], int nmb)
{
    int id;
    int i;
    system("cls");
    printf("请输入需要查询的员工编号:");
    scanf("%d", &id);
    printf("员工编号    员工姓名    基本工资    扣税金额   绩效工资   补贴\n");
    for (i = 0; i < nmb; i++)
    {
        if (a[i].id == id)
        {
            printf("%8d  %20s  %8.2f  %8.2f  %8.2f  %8.2f\n", a[i].id, a[i].name, a[i].solary, a[i].ks, a[i].jx, a[i].bt);
            system("pause");
            return;
        }
    }
    printf("未找到该员工!\n");
    system("pause");
}

int main()
{
    Employee a[MAXNMB];
    int nmb = 0;
    int op;
    while (1)
    {
        system("cls");
        printf("-------------工资管理系统--------------\n");
        printf("  1.新增员工信息\n");
        printf("  2.删除员工信息\n");
        printf("  3.修改员工信息\n");
        printf("  4.显示所有员工信息\n");
        printf("  5.查询员工信息\n");
        printf("  0.退出系统\n");
        scanf("%d", &op);
        switch (op)
        {
        case 0: return 0;
        case 1: input(a, &nmb); break;
        case 2:dele(a, &nmb); break;
        case 3:Mod(a, nmb); break;
        case 4:showAll(a, nmb); break;
        case 5:search(a, nmb); break;
        }
    }
    return 0;
}