职工工资管理系统
(1) 系统名称:职工工资管理系统的设计
(2) 准备数据
新建一个文本文件,文件名为:“班名+序号”,如计科62001班的12号同学所建的文件名应为:JK0112.txt。将每一个职工的姓名、职工号以及基本工资、职务工资、岗位津贴、医疗保险、公积金、水电费的数据作为一个记录。该软件能建立一个新的数据文件或给已建立好的数据文件增加记录。
数据示例:
职工号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 水电费 应发工资(总和) 实发工资
01 张望 4286 1246 398 189 235 165
02 李明 3185 628 335 94 114 270
03 王小民 2895 738 298 164 173 130
04 张效章 3550 568 210 156 150 151
05 彭山 2745 1398 284 161 168 68
(注:请大家将该文本文件后保存到自己的存储设备,运行程序前请保存相应的副本)
(3) 功能要求
在主函数中读入原始数据文件的内容,保存在对应的结构体数组中,然后显示菜单,利用菜单调用各个函数,分别完成如下功能:(建议数据文件和程序文件放在同一目录中,使用fopen函数以只读的方式打开文件)。
如有帮助,请采纳。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NUM 1000
void enter();
void search_num();
void dele_num();
void modi_num();
void browse();
void count();
void load();
void add();
void menu();
int n; //员工的总数
struct emploee //职工数据结构
{
char no[5];
char name[8];
char sex[3];
int age;
float wage1; //员工的基本工资
float wage2; //员工的职务工资
float funds; //员工的住房公积金
float WATERfee; //员工的水电费
float TAXfee; //员工的个人所得税
float wage3; //员工的实发工资
}emp[NUM],newemp;
void main()
{
menu();
}
void menu()//主界面
{ int n,w1;
do
{ system("cls");
printf("************* 职工工资管理系统 **************\n");
printf("* 1-----输入职工信息 *\n");
printf("* 2-----查询职工信息 *\n");
printf("* 3-----根据职工ID号修改 *\n");
printf("* 4-----根据职工ID号删除 *\n");
printf("* 5-----据工资统计并浏览 *\n");
printf("* 6-----从文件载入信息 *\n");
printf("* 7-----浏览全部职工 *\n");
printf("* 8-----追加职工信息 *\n");
printf("* 9-----退出程序 *\n");
printf("***************************************************\n");
printf(" 输入您的选择(1-9):[ ]\b\b");
scanf("%d",&n);
if(n<1||n>9) //对选择的数字作判断
{
w1=1;
printf("your choice is not between 1 and 9,Please input again:");
getchar();
}
else w1=0;
}
while(w1==1);
switch(n)
{ case 1:enter(); break;
case 2:search_num(); break;
case 3:modi_num(); break;
case 4:dele_num(); break;
case 5:count (); break;
case 6:load(); break; //保存模块
case 7:browse(); break; //加载模块
case 8:add(); break;
case 9:printf("\n×××××××谢谢,欢迎下次光临!×××××××\n\n");
default:exit(0); //退出系统,exit(0)函数功能是退出程序。
}
}
/*************************输入模块**********************/
void enter()
{
FILE *fp;
int n,i;
if ((fp=fopen("emp.txt","wb"))==NULL)
{
printf("不能建立emp文件\n");
exit(1);
}
printf("输入职工人数:");
scanf("%d",&n);
printf("输入格式:职工号 姓名 性别 年龄 基本工资 职务工资 公积金 水电费 税<Enter>\n");
for(i=0;i<n;i++) /* 循环获取n个职工记录 */
{
printf("第%d个职工:",i+1);
scanf("%s%s%s%d%f%f%f%f%f",emp[i].no,emp[i].name,emp[i].sex,&emp[i].age,
&emp[i].wage1,&emp[i].wage2,&emp[i].funds,&emp[i].WATERfee,&emp[i].TAXfee);
emp[i].wage3=emp[i].wage1+emp[i].wage2+emp[i].funds-emp[i].WATERfee-emp[i].TAXfee;
}
for(i=0;i<n;i++) /*将n个职工记录写入文件*/
fwrite(&emp[i],sizeof(struct emploee),1,fp);
fclose(fp);
}
/*************************统计模块**********************/
void count()
{
FILE *fp;
int n,num;
if((fp=fopen("emp.txt","rb"))==NULL)
{
printf("不能打开emp文件\n");
exit(1);
}
printf("请输入工资数:");
scanf("%d",&num);
printf("记录号 职工号 姓名 性别 年龄 基本工资 职务工资 公积金 水电费 税 实发工资\n");
for(n=0;fread(&emp[n],sizeof(struct emploee),1,fp)!=0;n++)
if(emp[n].wage3>=num)
printf("%6d%6s%9s%4s%5d %.1f %.1f %.1f %.1f %.1f %.1f\n",n+1,emp[n].no,emp[n].name,emp[n].sex, emp[n].age,emp[n].wage1,
emp[n].wage2,emp[n].funds,emp[n].WATERfee,emp[n].TAXfee,emp[n].wage3);
fclose(fp);
}
/********************删除模块*******************/
void dele_num()
{
FILE *fp;
int i,j,n;
char num[5];
if((fp=fopen("emp.txt","rb"))==NULL)
{
printf("不能打开emp文件\n");
exit(1);
}
printf("删除前:\n");
printf("记录号 职工号 姓名 性别 年龄 基本工资 职务工资 公积金 水电费 税 实发工资\n");
for(n=0;fread(&emp[n],sizeof(struct emploee),1,fp);n++)
printf("%6d%6s%9s%4s%5d %.1f %.1f %.1f %.1f %.1f %.1f\n",n+1,emp[n].no,emp[n].name,emp[n].sex, emp[n].age,emp[n].wage1,
emp[n].wage2,emp[n].funds,emp[n].WATERfee,emp[n].TAXfee,emp[n].wage3);/*n为emp文件中记录数*/
printf("要删除的职工号:");
scanf("%s",num);
for(i=0;(strcmp(emp[i].no,num)!=0&&i<n);i++)
if(i>=n)
{
printf("\t没有%s职工号的职工\n",num);
exit(2);
}
fclose(fp);
fp=fopen("emp.dat","w+");
if(n==1) /*一个记录已经删除了*/
{
fclose(fp);
exit(3);
}
for(j=0;j<i;j++)
fwrite(&emp[j],sizeof(struct emploee),1,fp);
for(j=i+1;j<n;j++)
fwrite(&emp[j],sizeof(struct emploee),1,fp);
printf("删除后:\n");
fseek(fp,0,SEEK_SET);
printf("记录号 职工号 姓名 性别 年龄 基本工资 职务工资 公积金 水电费 税 实发工资\n");
for(i=0;fread(&emp[i],sizeof(struct emploee),1,fp);i++)
printf("%6d%6s%9s%4s%5d% %.1f %.1f %.1f %.1f %.1f %.1f\n",i+1,emp[i].no,emp[i].name,emp[i].sex, emp[i].age,emp[i].wage1,
emp[i].wage2,emp[i].funds,emp[i].WATERfee,emp[i].TAXfee,emp[i].wage3);
fclose(fp);
}
/********************修改模块*******************/
void modi_num()
{
FILE *fp;
int i,j;
char num[5];
if((fp=fopen("emp.txt","rb+"))==NULL)
{
printf("不能 打开emp文件\n");
exit(1);
}
printf("要修改的职工号:");
scanf("%s",num);
for(i=0;fread(&emp[i],sizeof(struct emploee),1,fp);i++)
if(!strcmp(emp[i].no,num))break;
if(feof(fp))
{
printf("\t没有%s职工号的职工\n",num);
exit(2);
}
printf("记录号 职工号 姓名 性别 年龄 基本工资 职务工资 公积金 水电费 税 实发工资\n");
printf("%6d%6s%9s%4s%5d% %.1f %.1f %.1f %.1f %.1f %.1f\n",i+1,emp[i].no,emp[i].name,emp[i].sex, emp[i].age,emp[i].wage1,
emp[i].wage2,emp[i].funds,emp[i].WATERfee,emp[i].TAXfee,emp[i].wage3);
printf("输入格式:职工号 姓名 性别 年龄 基本工资 职务工资 公积金 水电费 税 <Enter>\n");
printf("第%d个记录:",i+1);
scanf("%s%s%s%d%f%f%f%f%f",newemp.no,newemp.name,newemp.sex,&newemp.age,
&newemp.wage1,&newemp.wage2,&newemp.funds,&newemp.WATERfee,&newemp.TAXfee);//获取新的职工记录
newemp.wage3=newemp.wage1+newemp.wage2+newemp.funds-newemp.WATERfee-newemp.TAXfee;
fseek(fp,-(long)sizeof(struct emploee),SEEK_CUR); //文件指针指向该修改的记录开头
fwrite(&newemp,sizeof(struct emploee),1,fp); //用newemp覆盖当前记录
printf(" 修改后:\n");
fseek(fp,0,SEEK_SET); //显示修改后的文件数据
printf("记录号 职工号 姓名 性别 年龄 基本工资 职务工资 公积金 水电费 税 实发工资\n");
for(i=0;fread(&emp[i],sizeof(struct emploee),1,fp)!=0;i++)
printf("%6d%6s%9s%4s%5d %.1f %.1f %.1f %.1f %.1f %.1f\n",i+1,emp[i].no,emp[i].name,emp[i].sex, emp[i].age,emp[i].wage1,
emp[i].wage2,emp[i].funds,emp[i].WATERfee,emp[i].TAXfee,emp[i].wage3);
fclose(fp);
}
/*************************查询模块***********************/
void search_num()
{
FILE *fp;
int i;
char num[5];
if((fp=fopen("emp.txt","rb"))==NULL)
{
printf("不能打开emp文件\n");
exit(1);
}
printf("要查询的职工号:");
scanf("%s",num);
for(i=0;fread(&emp[i],sizeof(struct emploee),1,fp);i++)
if(!strcmp(emp[i].no,num)) break;
if(feof(fp))
{
printf("\t查无此人\n");
exit(2);
}
printf("记录号 职工号 姓名 性别 年龄 基本工资 职务工资 公积金 水电费 税 实发工资\n");
printf("%6d%6s%9s%4s%5d %.1f %.1f %.1f %.1f %.1f %.1f\n",i+1,emp[i].no,emp[i].name,emp[i].sex, emp[i].age,emp[i].wage1,
emp[i].wage2,emp[i].funds,emp[i].WATERfee,emp[i].TAXfee,emp[i].wage3);
fclose(fp);
}
/*******************浏览模块********************/
void browse()
{ int i;
FILE *fp;
if((fp=fopen("emp.txt","r"))==NULL)
{
printf("不能打开emp文件\n");
exit(0);
}
printf("记录号 职工号 姓名 性别 年龄 基本工资 职务工资 公积金 水电费 税 实发工资\n");
for(i=0;fread(&emp[i],sizeof(struct emploee),1,fp)!=0;i++)
{
printf("%6d%6s%9s%4s%5d %.1f %.1f %.1f %.1f %.1f %.1f\n",i+1,emp[i].no,emp[i].name,emp[i].sex, emp[i].age,emp[i].wage1,
emp[i].wage2,emp[i].funds,emp[i].WATERfee,emp[i].TAXfee,emp[i].wage3);
}
fclose(fp);
}
/******************追加模块*******************/
void add()
{
FILE *fp;
int n,i,j;
if((fp=fopen("emp.txt","ab+"))==NULL)
{
printf("不能打开emp文件\n");
exit(0);
}
printf("要追加的职工人数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("输入格式:职工号 姓名 性别 年龄 基本工资 职务工资 公积金 水电费 税 <Enter>\n");
printf("追加记录:\n");
scanf("%s%s%s%d%f%f%f%f%f",newemp.no,newemp.name,newemp.sex,&newemp.age,
&newemp.wage1,&newemp.wage2,&newemp.funds,&newemp.WATERfee,&newemp.TAXfee);
newemp.wage3=newemp.wage1+newemp.wage2+newemp.funds-newemp.WATERfee-newemp.TAXfee;//获取一个新的职工记录
fwrite(&newemp,sizeof(struct emploee),1,fp); //将该职工记录写入文件
}
fclose(fp);
}
/*************************载入模块**********************/
void load() //加载记录或可以计算记录个数的函数
{
FILE *fp;
int i,w;
w=1;
system( "cls" );
if((fp=fopen("emp.txt","rb"))==NULL) //以输出打开方式,在此前的记录被覆盖
{
printf("\nCannot open file\n");
w=0;
return ;
}
n=0;
for(i=0;!feof(fp);i++)
{
fread(&emp[i],sizeof(struct emploee),1,fp);
n++;
}
n=n-1;
fclose(fp);
if(w==1)
{
printf("Load file ok!");
getchar();
getchar();
menu();
}
}