职工工资管理系统

本文记录了一次使用C语言开发职工工资管理系统的实践过程,包括数据结构设计、信息录入、数据保存到硬盘和数据载入等功能。在信息录入功能中遇到并解决了if else语句同时执行的问题,通过fscanf和fprintf实现数据文件的读写。文章提供了部分关键代码和调试截图,期待同行的反馈和建议。

职工工资管理系统

暑假学校实习,要求做个工资管理系统。写这篇博客来记录下过程,以及在做的过程中的一些总结!提前说下这是基于C语言写的管理系统!

话不多说,先上图介绍下有哪些功能!

在这里插入图片描述

1.首先来开下数据结构吧

#define N 100
struct Worker
{
   
   
    char workernum[10];//员工编号
    char workername[20];//员工姓名
    int basicwage;//员工基本工资
    int allowance;//津贴
    int Bonus;//员工工资
    int totalwage;//员工总工资
}Worker_Infor[N];
struct Worker temp;
int m;//定义全局变量控制人数

结构体数组这块没啥太多东西,一些员工的基本属性就OK了,其实在这里本来想用动态数组的但是C语言这学期学完后没往深了看,就没使用动态赋值!?

2. ? 看看第一个功能吧,信息录入。这个功能比较好弄,而且方法也比较多。

那就不多说了,上代码!
void Input_Infor()
{
   
   
    char c,nums[20];
    int i,j,flag=1;
    if(m==0)
        i=0;
    else i=m;
    printf("  ------------------------| 员工信息录入 |------------------------------\n");
    printf("  ======================================================================\n");
    while(1)
    {
   
   
        printf("  ||                     -第%d位职工的编号:",i+1);
        TO:
            if(m==0)
            {
   
   
                gets(Worker_Infor[m].workernum);
            }
            else
            {
   
   
                gets(nums);
                for(j=0;j<m;j++)
                {
   
   
                    if(strcmp(nums,Worker_Infor[j].workernum)==0)
                    {
   
   
                        printf("  ||                     -已存在!请重输:");
                        goto TO;
                    }
                    else
                    {
   
   
                        strcpy(Worker_Infor[i].workernum,nums);
                    }
                }
            }
        printf("\n  ||                    -工号为%s职工的姓名:",Worker_Infor[i].workernum);
        gets(Worker_Infor[i].workername);
        printf("\n  ||                      -%s职工基本工资:",Worker_Infor[i].workername);
        while(1)
        {
   
   
            scanf("%d",&Worker_Infor[i].basicwage);
            if(Worker_Infor[i].basicwage>=0) break;
            else printf("\n  ||                      输入错误,请重试:");
        }
        printf("\n  ||                        -%s职工的津贴:",Worker_Infor[i].workername);
        while(1)
        {
   
   
            scanf("%d",&Worker_Infor[i].allowance);
            if(Worker_Infor[i].allowance>=0) break;
            else printf("\t输入错误,请重试:");
        }
        printf("\n  ||                        -%s职工的奖金:",Worker_Infor[i].workername);
        while(1)
        {
   
   
            scanf("%d",&Worker_Infor[i].Bonus);
            if(Worker_Infor[i].Bonus>=0) break;
            else printf("\t输入错误,请重试:");
        }
        i++;
        m=i;
        getchar();
        printf("\n  ||                       -是否继续输入:Y or N 或者 y or n:");
        scanf("%c",&c);
        getchar();
        if(c=='N'||c=='n')
        {
   
   

            system("cls");
            printf("  =========================================================================================\n");
            printf("  ||                                                                                      ||\n");
            printf("  ||                                     感谢您的使用!                                   ||\n");
            printf("  ||                                                                                      ||\n");
            printf("  ||                                   信息更新完毕请保存!                                ||\n");
            printf("  ||                                                                                      ||\n");
            printf("  ||                                 - @author by---Zdde丶 -                              ||\n");
            printf("  =========================================================================================\n");
            break;
        }
    }
}

这部分有一个点,就是在录入编号的时候,要检查数据文件里面是否有重复的。开始弄这个时觉得这个功能很简单,想着用个while(1)循环里面套for循环,遍历结构体数组。也就是把现在代码里面的goto换成了while(1)来做的,结果出现了一个很不可思议的问题,就是if else语句居然if和else里面的东西同时满足并且执行了。后来也发现了问题所在。但是这个问题真的很隐蔽。

3. 再就是保存数据到硬盘的功能了

保存文件就用到了C语言的文件管理。课堂上老师也就一笔带过,再弄这块也是疯狂的百度资料。
主要是查询fread fwrite ,fscanf以及fprintf这四个函数的用法。想来想去还是用了fscanf和fprintf这两个。毕竟是刚自学不久,我就不讲二者用法了。上代码看看这个功能吧

void Save_Infor()
{
   
   
    int i,n=0;
    FILE *pk;
    FILE *pf;
    Cal_Wages();
    pk=fopen("Worker.txt","w");
    pf=fopen("sumpeo.txt","w");
    n += m;//这里其实是多余的直接使用m即可
    fprintf(pf,"%d",n);
    if(pk==NULL||pf==NULL);
    {
   
   
        printf("文件打开失败\n");
        exit(0);
    }
    for(i=0;i<m;i++)
    {
   
   
        fprintf(pk,"\t%10s\t%8s\t%10d\t%8d%8d%6d\t\n",Worker_Infor[i].workernum,Worker_Infor[i].workername,Worker_Infor[i].basicwage,Worker_Infor[i].allowance,Worker_Infor[i].Bonus,Worker_Infor[i].totalwage);
    }

    fclose(pf);
    fclose(pk);

        printf("  =======================================================================================\n");
        printf("  ||                                                                                    ||\n");
        printf("  ||                                  文件保存成功                                      ||\n");
        printf("  ||                                                                                    ||\n");
        printf("  =======================================================================================\n");

}

保存文件这块,也就这点代码,但是真的让我查了很久的资料!

4.数据载入

功能快捷键

int Up_infor()
{
   
   
    FILE *fp;
    FILE *pk;

    int i;
    fp = fopen("Worker.txt","r");
    pk = fopen("sumpeo.txt","rb");
    if(pk==NULL)
    {
   
   
        printf("  =======================================================================================\n");
        printf("  ||                                                                                    ||\n");
        printf("  ||                                  文件打开失败                                      ||\n");
        printf("  ||                                                                                    ||\n");
        printf("  =======================================================================================\n");

    }
    else
    {
   
   
        fscanf(pk,"%d",&m);
        //printf("%d",m);
    }
    for(i=0;i<m;i++)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值