工资管理系统的开发设计
(一)需求分析
本次课题为工资管理系统的开发和设计。即模拟公司实际运营情况,对员工工资进行管理。整体实现职工工资的录入,删除,查找,修改,读取,工资排序等要求。
应实现以下功能:
数据录入功能 主要是对员工工资的日常管理,如:工资的输入,修改,迅速准确地完成工资信息统计计算以及对员工信息录入,修改等相关操作。
数据查询功能 1) 查询某一员工每个月份的工资情况 2) 查询某一月份每个员工的工资情况 3) 按编号查找某个员工的全部信息
数据删除功能 删除某一员工的相关信息 4.数据统计功能 统计员工交纳个人所得税以后的实际工资
数据排序功能 对某一员工按照各月工资高低排序
数据保存功能 将员工信息保存到文件
(二)初步设计
(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.实际情况还应包含更多内容。如:加班时间,加班类别,加班天数,岗位补贴,事假扣款,病假扣款,年终奖金等,应该具体完善。