这个是我的课程设计要求,因为要求较为模糊,所以自行发挥的地方较多,读者可以自行阅读,根据需要修改代码。。。。。
工资管理系统程序设计
【题目描述】
工资管理系统是针对企业的工资管理业务进行计算机处理而开发的应用软件。该系统由系统维护、输入、查询、修改、输出、统计等子模块组成,功能基本涵盖普通企业的工资管理业务范围。企业应用本系统后,可以有效的提高工资管理水平。从需求分析、开发平台选择、系统模块建立、数据库设计、功能模块编程实现及软件测试等方面阐述了本应用系统的设计过程。为便于说明,文中绘制了程序结构框图、数据流程图和部分界面图。最后附有主要的源程序代码清单。
【题目要求】
该软件主要是实现对职工工资进行系统化的管理,首先可以对工资基本信息进行输入和存取,其次可以读取工资的相关信息,然后可以删除和插入工资的相关信息,还有就是可按职工号查询此职工号的职工的相关信息,并按照工资统计结果的高低进行排序。由此来系统化管理职工工资,并达到简易操作的目的。
【功能说明】
该系统的主要功能是实现职工工资的录入,包括(录入职工的基本工资、实发工资、津贴、岗贴、补贴、房帖、交通补贴、储蓄、汇费)。对职工的工资信息进行删除、修改、个人所得税的计算。并统计职工的所有信息。该系统功能主要包括六大模块:
1)职工个人说得税的计算模块,根据工资多于10000,在5000—10000之间,少于5000三种情况进行计算。
2)添加职工的工资信息模块,用户根据输入职工编号后,对工资信息进行录入。
3)职工工资查询模块,根据用户输入职工编号后,方可进行查询。
4)职工工资修改模块,用户输入职工编号后,对以前的信息进行修改。
5)数据输出模块,输出其相应的模块功能。
6)职工工资统计模块,根据输入的职工信息进行统计。
【设计要求】
(1)有较为美观简洁大方的菜单,能保证用户方便、直观、快捷的熟悉并使用软件的各项功能。
(2)有严密正确的数据验证功能和数据处理功能,能够查询、统计,对工资进行排序,对数据进行保存和读取,能按职工号查找工资信息,以及插入和删除工资信息。
(3)系统要有一定的可靠性。
【源代码】
#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;
}
}