能发一下详细C的代码吗

 职工工资管理系统

(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函数以只读的方式打开文件)。

  1. 职工信息实现查询和显示功能:①按职工号或姓名查询详细信息 ②查询基本工资低于1000的信息③显示全部信息。将满足查询条件的整条记录显示在屏幕上。
  2. 计算个人工资应发工资(等于基本工资+职务工资+津贴),实发工资(等于应发工资扣除医疗保险、公积金、水电费),并按工资条的形式输出(输出格式自行设计)。
  3. 修改记录:可以对数据文件的任意记录的数据进行修改并在修改前后对记录内容进行显示。
  4. 添加记录:录入新的职工信息数据。在录入新的信息前,首先判断该职工号是否存在,如果不存在,则可进行数据录入并依次输入职工的相关信息;如果存在,则提示不能进行添加操作。
  5. 删除记录:可删除数据文件中的任一记录。
  6. 排序:按基本工资或实发工资排序。
  7. 统计:计算各项工资平均值,并将结果保存到新的文件中。

如有帮助,请采纳。

#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();                
    }
}