职工工资管理系统
暑假学校实习,要求做个工资管理系统。写这篇博客来记录下过程,以及在做的过程中的一些总结!提前说下这是基于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++)
{
fscanf(fp,"\t%10s\t%8s",Worker_Infor[i].workernum,Worker_Infor[i].workername)