问答详情
源自:1-1 初始C语言

请大神帮我注释全部,看不懂这代码。

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

    }

}


提问者:慕盖茨7128470 2017-11-16 14:40

个回答

  • 慕前端3554511
    2017-11-19 11:11:47

    为什么要一次性调用这么多子函数,可以多兴建一些项目

  • 慕斯9595756
    2017-11-16 16:27:25

    你这积分太少了