工资管理系统的开发设计

工资管理系统的开发设计

(一)需求分析

  本次课题为工资管理系统的开发和设计。即模拟公司实际运营情况,对员工工资进行管理。整体实现职工工资的录入,删除,查找,修改,读取,工资排序等要求。

应实现以下功能:

  1. 数据录入功能
    主要是对员工工资的日常管理,如:工资的输入,修改,迅速准确地完成工资信息统计计算以及对员工信息录入,修改等相关操作。
  2. 数据查询功能
    1) 查询某一员工每个月份的工资情况
    2) 查询某一月份每个员工的工资情况
    3) 按编号查找某个员工的全部信息
  3. 数据删除功能
    删除某一员工的相关信息
    4.数据统计功能
    统计员工交纳个人所得税以后的实际工资
  4. 数据排序功能
    对某一员工按照各月工资高低排序
  5. 数据保存功能
    将员工信息保存到文件

(二)初步设计

(1) 用结构体数组存储每个员工信息

struct Month
{
    int month;
    int money;
    int finalmoney;
};
struct worker
{
    char name[30];
    char id[10];
    char job[30];
    unsigned char flag;
    int  mnum;
    int  finalmoney;
    struct Month m[13] ;
} num[maxnum]; //定义人员信息数组

(2) 流程图

在这里插入图片描述

(三)详细设计

(1)代码展示

a.全局变量和头文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define maxnum 100

FILE*in; //定义文件指针
FILE*out; //定义文件指针

int worknum = 0;

b.主界面

void show()
{
    printf("\n");
    printf("***************工资管理系统主界面***************\n");
    printf("1.职工信息录入\t\t");
    printf("2.职工信息删除\n");
    printf("3.职工信息查找\t\t");
    printf("4.职工信息修改\n");
    printf("5.职工信息读取\t\t");
    printf("6.按照工资排序\n");
    printf("7.返回主界面\t\t");
    printf("8.退出系统\n");
    printf("************************************************\n");
}


c.写入文件和读文件

void Write_File()
{
    FILE *fp;
    int i;
    if ((fp = fopen("worker.txt", "wb")) == NULL)  //打开文件
    {
        printf("inFile open error!\n");
        exit(1);
    }
    for(i=0; i<worknum; i++)
    {
        fwrite(&num[i],sizeof(struct worker),1,fp);
    }

    fclose(fp);
}



void Read_File()
{
    int i=0;
    FILE *fp;
    if ((fp = fopen("worker.txt", "r")) == NULL)  //打开文件  wb
    {
        printf("outFile open error!\n");
        //exit(1);
        worknum = 0;
        return;
    }
    memset(num,0,maxnum*sizeof(struct worker));

    while(!feof(fp))
    {
        fread(&num[i++],sizeof(struct worker),1,fp);
    }

    worknum=i-1;
    fclose(fp);

}

d.录入

//添加职工信息
void record(int n)
{
    int i,j,salary,month,money;
    char id[10];
    int f=0;
    struct worker tmp;

    Read_File();

    system("cls");
    printf("录入职工信息:\n");
    for(i=0; i<n; i++)
    {
        printf("请输入第%d个职工的编号\n",i+1);

        scanf("%s",tmp.id);
        //判断
        for(j=0; j<worknum; j++)
        {
            if(strcmp(tmp.id,num[j].id)==0)
            {
                printf("此编号已存在,不能重复添加!!");
                return;
            }
        }

        printf("开始录入:\n");
        printf("请输入第%d人姓名信息:",i+1);
        scanf("%s",tmp.name);
        printf("请输入第%d人的职务:",i+1);
        scanf("%s",tmp.job);

        printf("请输入总的工资月份数:\n");
        scanf("%d",&tmp.mnum);
        memset(tmp.m,0,13*sizeof(struct Month));

        for(j=0; j<tmp.mnum; j++)
        {
            printf("请输入第%d个月份:\n",j+1);
            scanf("%d",&tmp.m[j].month);
            printf("请输入第%d人第%d个月应得工资:",i+1,j+1) ;
            scanf("%d",&tmp.m[j].money);
          //  printf("请输入第%d人第%d个月实际工资:",i+1,j+1) ;
           // scanf("%d",&tmp.m[j].finalmoney);
             tmp.m[j].finalmoney=actulSalary(tmp.m[j].money);
             printf("第%d人第%d个月应得工资为%d:",i+1,j+1,tmp.m[j].finalmoney) ;
        }
        tmp.flag=1;
        num[worknum++]=tmp;
    }

    Write_File();
    printf("添加成功!\n");
}

e.读取

//读取职工信息
void read()
{
    int i,j;
    system("cls");
    printf("读取职工信息:\n");
    Read_File();
    printf("月份\t职工号\t姓名\t职务\t应得工资\t实际工资\n");

    for(i=0; i<worknum; i++)
    {
        for(j=0; j<num[i].mnum; j++)
        {
            printf("%d\t",num[i].m[j].month);
            printf("%s\t %s\t %s\t %d\t\t %d\t \n",num[i].id,num[i].name,num[i].job,num[i].m[j].money,num[i].m[j].finalmoney);
        }
    }
}

f.查找

//方法一查找信息
void search1()
{
    int i, j, flag = 0;
    char id[10];
    printf("*****按编号查找某个员工的全部信息****** \n");
    printf("请输入编号:");
    scanf("%s", id);
    Read_File();
    for(i=0; i<worknum; i++)
    {
        if(strcmp(num[i].id,id)==0)
        {
            if(flag==0)
            {
                flag=1;
                printf("查找成功!\n");
                printf("月份 \t职工号\t 姓名\t 职务\t 应得工资\t 实际工资\n");
            }
            for (j = 0; j < num[i].mnum; j++)
            {
                printf("%d\t %s\t %s\t %s\t %d\t\t %d\t\n", num[i].m[j].month, num[i].id, num[i].name, num[i].job, num[i].m[j].money,num[i].m[j].finalmoney);

            }
        }
    }
    if(flag==0)
    {
        printf("查找编号%s失败\n",id);
        return;
    }

    return ;

}
//方法二查找信息
void search2()
{
    int month, i,j, f = 0,flag=0;
    char id[30];
    printf("按编号查找某一员工某个月的工资情况\n");
    printf("请输入员工编号:");
    scanf("%s", id);
    printf("请输入查找月份:");
    scanf("%d", &month);
    Read_File();

    for(i=0; i<worknum; i++)
    {
        if(strcmp(num[i].id,id)==0)
        {
            if(flag==0)
            {
                flag=1;
                printf("查找成功!\n");
                printf("月份 \t职工号\t 姓名\t 职务\t 应得工资\t 实际工资\n");
            }
            for (j = 0; j < num[i].mnum; j++)
            {
                if(num[i].m[j].month==month)
                    printf("%d\t %s\t %s\t %s\t %d\t\t %d\t\n", num[i].m[j].month, num[i].id, num[i].name, num[i].job, num[i].m[j].money,num[i].m[j].finalmoney);

            }
        }
    }
    if(flag==0)
    {
        printf("查找失败\n");
        return;
    }
}
//方法三查找信息
void search3()
{
    int month, i,j, f = 0,flag =0;
    printf("按照月份查找该月所有人的工资情况\n");
    printf("请输入查找月份!");
    scanf("%d", &month);
    Read_File();
    for(i=0; i<worknum; i++)
    {
        for (j = 0; j < num[i].mnum; j++)
        {
            if(num[i].m[j].month==month)
            {
                if(flag==0)
                {
                    flag=1;
                    printf("查找成功!\n");
                    printf("月份 \t职工号\t 姓名\t 职务\t 应得工资\t 实际工资\n");
                }
                printf("%d\t %s\t %s\t %s\t %d\t\t %d\t\n", num[i].m[j].month, num[i].id, num[i].name, num[i].job, num[i].m[j].money,num[i].m[j].finalmoney);
            }
        }

    }
    if(flag==0)
    {
        printf("查找失败\n");
        return;
    }

}


//查找职工信息
void search()
{
    int m;
    char c;
    system("cls");
    printf("查找职工信息:\n");
    printf("1.按编号查找某个员工的全部信息 \n2.按编号查找某一员工某个月的工资情况\n3.按照月份查找该月所有人的工资情况\n");
    printf("请选择相关操作:");
    scanf("%d",&m);
    switch(m)
    {
    case 1:
        search1();
        break;
    case 2:
        search2();
        break;
    case 3:
        search3();
        break;
    }

    return 0;

}

g.修改

//修改职工信息
void modify()
{
    int c,i,j,f=0;
    char ch;
    char name[30],job[30],id[10];
    int flag = 0;
    Read_File();
    //Write_File();
    printf("修改员工信息:\n");
    printf("请输入员工编号:");
    scanf("%s",id);
    for(i=0; i<worknum; i++)
    {
        if(strcmp(num[i].id,id)==0)
        {
            flag=1;
        }
    }
    if(flag==0)
    {
        printf("未找到编号%s\n",id);
        return;
    }
    printf("1.修改姓名 2.修改职务 3.修改工资 4.修改月份\n");
    printf("请选择:");
    scanf("%d",&c);

    switch(c)
    {
    case 1:
    {
        system("cls");
        printf("**********修改姓名*********\n");

        for(i=0; i<worknum; i++)
        {
            if(strcmp(num[i].id,id)==0)
            {
                printf("员工原来的姓名为:%s\n",num[i].name);
                printf("请输入员工的新姓名:");
                scanf("%s",name);
                strcpy(num[i].name,name);
                printf("修改成功!\n");
            }
        }
        Write_File();
        break;

    }
    case 2:
    {

        system("cls");
        printf("**********修改职务*********");
        for(i=0; i<worknum; i++)
        {
            if(strcmp(num[i].id,id)==0)
            {
                printf("员工的原来职务为:%d\n",num[i].job);

                printf("请输入员工的新职务:");
                scanf("%s",job);
                strcpy(num[i].job,job);
                printf("修改成功!\n");
            }
        }
        Write_File();
        break;
    }
    case 3:
    {
        int salary,month;
        system("cls");
        printf("**********修改工资*********");
        printf("请输入月份:");
        scanf("%d",&month);

        for(i=0; i<worknum; i++)
        {
            if(strcmp(num[i].id,id)==0)
            {
                for(j=0; j<=num[i].mnum; j++)
                {
                    if(num[i].m[j].month==month)
                    {
                        printf("员工%d月的原来工资为:%d\n",month,num[i].m[j].money);

                        printf("请输入员工%d月的新工资:",month);
                        scanf("%d",&num[i].m[j].money);
                        printf("修改成功!\n");
                    }
                }
            }
        }
        Write_File();

        break;
    }
    case 4:
    {
        int month,newmonth;
        system("cls");
        printf("**********修改月份*********");
        printf("请输入想要修改的月份:");
        scanf("%d",&month);

        for(i=0; i<worknum; i++)
        {
            if(strcmp(num[i].id,id)==0)
            {
                for(j=0; j<=num[i].mnum; j++)
                {
                    if(num[i].m[j].month==month)
                    {
                        printf("员工%d月的原来的月份为:%d\n",month,num[i].m[j].month);

                        printf("请输入员工的新月份:");
                        scanf("%d",&num[i].m[j].month);
                        printf("修改成功!\n");
                    }
                }
            }
        }
        Write_File();

    }
    break;
    }

    //system("pause");
}

h.删除

//删除职工信息

void delet()
{

    char id[10];
    char c;
    int i,flag=0;
    FILE *fp;
    system("cls");
    printf("删除职工信息:\n");
    printf("请输入职工编号:");
    scanf("%s",id);
    Read_File();
    if ((fp = fopen("worker.txt", "wb")) == NULL)  //打开文件
    {
        printf("open failedd!!\n");
        return;
    }

    for(i=0; i<worknum; i++)
    {
        if(strcmp(num[i].id,id)==0)
        {
            flag=1;
            continue;
        }
        fwrite(&num[i],sizeof(struct worker),1,fp);

    }
    if(flag==1)
        printf("删除成功!!\n");
    else
        printf("未找到该职工编号\n");
    Read_File();
    fclose(fp);
    return ;

}

i.计算实际工资

 int actulSalary(int money)
{
    int k=money/1000;
    double rate;
    switch(k)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    {
        rate=0.1;
        //printf("%.2",money-money*rate);
        break; }
    case 5:
    case 6:
    {
        rate=0.2;
        break;
    }
    case 7:
    case 8:
    {
        rate=0.3;
        break;
    }
    default:
    {
        rate=0.4;
        break;

    }
    }
    return money-money*rate;
}

j.主函数

void main()
{
    int choose,n,i;

    memset(num,0,maxnum*sizeof(struct worker));

    while(1)
    {

        show();
        printf("请输入数字,选择相关操作:");
        scanf("%d",&choose);
        system("cls");
        if(choose==8)
        {
            break;
        }
        switch(choose)
        {
        case 1:
        {
            system("cls");
            printf("请输入录入的人数:\n");
            scanf("%d",&n);
            record(n);
            break;
        }

        case 2:
            delet();
            break;
        case 3:
            search();
            break;
        case 4:
            modify();
            break;
        case 5:
            read();
            break;
        //case 6:
        //   save();
        //  break;
        case 6:
            sort();
            break;
        case 7:
            break;
        default :
            printf("输入数字不正确,请重新输入.");
            break;
        }
        system("pause");
        //system("cls");
    }
}

(三)算法改进

  1.将文件存储换为数据库存储应该更好些
  2.实际情况还应包含更多内容。如:加班时间,加班类别,加班天数,岗位补贴,事假扣款,病假扣款,年终奖金等,应该具体完善。

猜你喜欢

转载自blog.csdn.net/qq_42349617/article/details/84953441
今日推荐