⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gongziguanli.txt

📁 工资管理系统
💻 TXT
📖 第 1 页 / 共 3 页
字号:
void save()
{
   FILE *fp;  /*定义指向文件的指针*/
   SALARY *p; /*定义移动指针*/
   char outfile[10]; /*保存输出文件名*/
   clrscr();/*清屏*/
   printf("Enter outfile name,for example c:\\f1\\te.txt:\n");/*提示输入文件名格式信息*/
   scanf("%s",outfile);
   if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件*/
   {
      printf("can not open file\n");
      return; /*返回*/
   }
   printf("\nSaving file......\n");
   p=First; /*移动指针从头指针开始*/
   while(p!=NULL) /*如p不为空*/
   {
      fwrite(p,sizeof(SALARY),1,fp); /*写入一条记录*/
      p=p->next;  /*指针后移,处理下一条记录*/
   }
   fclose(fp); /*关闭文件*/
   printf("-----save success!!-----\n");/*显示保存成功*/
}
/*读文件*/
void load()
{
   SALARY *p,*q=NULL; /*定义记录指针变量*/
   FILE *fp; /* 定义指向文件的指针*/
   char infile[10]; /*保存文件名*/
   clrscr();/*清屏*/
   printf("Enter infile name,for example c:\\f1\\te.txt:\n");/*输入文件名格式*/
   scanf("%s",infile); /*输入文件名*/
   if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/
   {
      printf("can not open file\n"); /*如不能打开,则结束程序*/
      return; /*返回*/
   }
   while(First) /*当表不为空时,清空链表*/
   {
      p=First; /*从头指针开始*/
      First=First->next; /*删除头结点*/
      free(p); /*释放空间*/
   }
   printf("\n -----Loading file!-----\n"); /*显示正在读文件*/
   First=(SALARY *)malloc(sizeof(SALARY)); /*为头指针申请空间*/
   if(!First) /*如果没有得到空间 显示内存溢出*/
   {
      printf("out of memory!\n");
      return;  /*返回*/
   }
   p=First; /*将头指针赋值给p*/
   while(!feof(fp)) /*当文件不空时*/
   {
      if(1!=fread(p,sizeof(SALARY),1,fp))break; /*将记录读到p所指的结点*/
      p->next=(SALARY *)malloc(sizeof(SALARY));/*为p的后继申请空间*/
      if(!p->next)  /*如果没有得到空间显示内存溢出*/
      {
	 printf("out of memory!\n");
	 return; /*返回*/
      }
      p->prior=q; /*得到空间,则链接指针关系p的前驱为q*/
      q=p;  /*保存p做为新的p结点的前驱*/
      p=p->next;  /*p指针后移*/
   }
   q->next=NULL; /*q的后继为空*/
   Last=q;  /*尾指针为q*/
   First->prior=NULL; /*头指针的前驱为空*/
   fclose(fp); /*关闭文件*/
   printf("---You have success read data from file!!!---\n"); /*显示成功读入记录*/
}
/*追加记录*/
void append()
{
   FILE *fp;   /*定义指向文件的指针*/
   SALARY *info; /*指向追加信息的指针*/
   char infile[10]; /*保存文件名*/
   float temp; /*临时变量*/
   clrscr(); /*清屏*/
   gotoxy(1,3);
   printf("**************gongziguanli************");
   gotoxy(1,5);
   printf("|------------------------------------|");
   gotoxy(1,6);
   printf("|    no    |      name      |  jbgz  | ");
   gotoxy(1,7);
   printf("|----------|----------------|--------|");
   info=(SALARY *)malloc(sizeof(SALARY)); /*申请追加信息的空间*/
   if(!info)
   {
      printf("\nout of memory"); /*没有空间,内存溢出*/
      exit(0);  /*结束程序*/
   }
   info->next=NULL;  /*新信息的后继为空*/
   info->prior=NULL; /*新信息的前驱为空*/
   gotoxy(1,8);printf("|");
   gotoxy(12,8);printf("|");
   gotoxy(29,8);printf("|");
   gotoxy(38,8);printf("|");
   gotoxy(2,8);
   inputs(info->no,10); /*输入编号并校验*/
   gotoxy(13,8);
   inputs(info->name,14); /*输入姓名并校验*/
   gotoxy(30,8);
   scanf("%f",&temp); /*输入基本工资*/
   info->jbgz=temp;
   info->koukuan=0; /*扣款为0*/
   info->yfgz=0; /*应发工资为0*/
   info->shuijin=0; /*税金为0*/
   info->sfgz=0; /*实发工资为0*/
   printf("|----------|----------------|--------|");
   printf("\n\n\nEnter infile name,for example c:\\f1\\te.txt:\n"); /*提示输入文件名*/
   scanf("%s",infile);
   if((fp=fopen(infile,"ab"))==NULL) /*打开文件*/
   {
      printf("can not open file\n");
      return;  /*返回*/
   }
   printf("\n -----Appending record!-----\n");
   if(1!=fwrite(info,sizeof(SALARY),1,fp)) /*向文件中追加记录*/
   {
      printf("-----file write error!-----\n"); /*写函数返回值不为1,说明写入错误*/
      return;  /*返回*/
   }
   printf("-----append  sucess!!----\n");/*显示追加成功*/
   fclose(fp);/*关闭文件*/
}
/*文件复制*/
void copy()
{
   char outfile[10],infile[10];  /*保存源文件名和目标文件名*/
   FILE *sfp,*tfp;  /*定义指向源文件和目标文件的指针*/
   SALARY *p=NULL;  /*定义临时指针,暂存读出的记录*/
   clrscr();
   printf("Enter infile name,for example c:\\f1\\te.txt:\n");
   scanf("%s",infile); /*输入源文件名*/
   if((sfp=fopen(infile,"rb"))==NULL) /*二进制读方式打开源文件*/
   {
      printf("can not open input file\n"); /*显示不能打开文件信息*/
      return; /*返回*/
   }
   printf("Enter outfile name,for example c:\\f1\\te.txt:\n");  /*提示输入目标文件名*/
   scanf("%s",outfile); /*输入目标文件名*/
   if((tfp=fopen(outfile,"wb"))==NULL) /*二进制写方式打开目标文件*/
   {
      printf("can not open output file \n");
      return;
   }
   while(!feof(sfp)) /*读文件直到文件尾*/
   {
      if(1!=fread(p,sizeof(SALARY),1,sfp))
	 break;/*块读*/
      fwrite(p,sizeof(SALARY),1,tfp); /*块写*/
   }
   fclose(sfp); /*关闭源文件*/
   fclose(tfp); /*关闭目标文件*/
   printf("you have success copy  file!!!\n");/*显示成功拷贝*/
}
/*排序*/
void sort()
{
   SALARY *p0,*p00,*p1,*p11,*p2; /*定义临时指针*/
   int i=1;  /*统计当前排第几个结点*/
   clrscr(); /*清屏*/
   printf("\n\n start sort....\n"); /*开始排序*/
   p1=p11=p2=First;
   while(p1!=NULL) /*当p1不为空时*/
   {
      p0=p1;    /*待比较结点从p1开始*/
      p2=p1;    /*p2从当前待排序位置开始*/
      while(p2->next!=NULL) /*p2的后继不为空时*/
      {
	 if(p0->sfgz>p2->next->sfgz)  /*找当前最小结点*/
	 {
	    p00=p2;   /*找到当前最小结点记录其前驱指针*/
	    p0=p2->next;  /*记录当前最小值结点的指针p0*/
	 }
	 p2=p2->next;  /*指针后移*/
      }
      Last=p0;  /*当前最小结点为尾结点*/
      if(p1!=p0)  /*判断最小结点是否是当前排序位置,不是则作指针修改*/
      {
	 p00->next=p0->next;  /*将p00的后继指向p0的后继*/
	 p0->next->prior=p00; /*p0的后继的前驱为p00*/
	 p0->next=p1;  /*p0的后继指向下个排序位置p1*/
	 p1->prior=p0; /*p1的前驱为p0*/
	 if(i==1)
	 {
	    First=p0;   /*作头指针*/
	    First->prior=NULL; /*头指针的前驱为空*/
	 }
	 else   /*不是第一个结点*/
	 {
	    p11->next=p0;   /*p11的后继指向p0*/
	    p0->prior=p11; /*p0的前驱指向p11*/
	 }
	 p11=p1=p0; /*因p0是排好序的最后一个结点,p1是下一个将要排序的位置,所以将p0赋值给p1和p11*/
      }
      i++;  /*排好序的结点数加1*/
      p1=p1->next; /*p1后移指向下一个待排序位置*/
   }
   printf("sort sucess!!!\n");  /*输出排序成功*/
}
/*索引*/
void index()
{
   SALARY *p,*q,*t,*h1; /*定义临时指针*/
   clrscr();/*清屏*/
   printf("\n\n start index.....\n\n"); /*显示开始索引*/
   h1=First->next; /*将原表的头指针所指的下一个结点作头指针*/
   First->next=NULL; /*第一个结点为新表的头结点*/
   Last=First; /*尾指针等于头指针*/
   while(h1!=NULL) /*当原表不为空时,进行排序*/
   {
      t=h1; /*取原表的头结点*/
      h1=h1->next; /*原表头结点指针后移*/
      p=First; /*设定移动指针p,从头指针开始*/
      q=First; /*设定移动指针q做为p的前驱,初值为头指针*/
      while(strcmp(t->no,p->no)>0&&p!=NULL) /*作编号比较*/
      {
	 q=p; /*待排序点值大,应往后插,所以新表指针后移*/
	 p=p->next;
      }
      if(p==q)  /*p==q,说明待排序点值小,应排在首位*/
      {
	 t->next=p; /*待排序点的后继为p*/
	 p->prior=t; /*p的前驱结点指向待排序结点*/
	 First=t; /*新头结点为待排序点*/
	 First->prior=NULL; /*头指针的前驱为空*/
      }
      else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/
      {
	 t->next=p; /*t的后继是p*/
	 t->prior=q; /*t的前驱是q*/
	 q->next=t; /*q的后继是t*/
	 if(p==NULL) /*判p是否为空*/
	    Last=t;   /*将t赋值为尾指针*/
	 else
	    p->prior=t; /*否则将t赋值给p的前驱*/
      }
   }
   printf("index sucess!!!\n");/*索引排序成功*/
}
/*分类合计*/
void total()
{
   struct t1  /*定义结构体保存合计数据*/
   {
      char u[7];  /*部门*/
      float s;   /*合计实发工资*/
   }unit[20];   /*定义一个单位部门数不超过20个*/
   SALARY *p,*q;  /*定义临时指针变量*/
   char sno[7],qno[7],*ptr; /*保存部门号*/
   float s1;  /*保存合计值*/
   int i,j;  /*控制变量*/
   p=First;  /*从指针开始*/
   i=0;  /*统计部门数*/
   clrscr();/*清屏*/
   while(p!=NULL) /*当p不为空时做下面的处理*/
   {
      memcpy(sno,p->no,6); /*从编号中取出部门号*/
      sno[6]='\0'; /*做字符串结束标记*/
      q=p->next; /*将指针指向待比较的记录*/
      s1=p->sfgz;  /*当前部门的实发工资初值作为该部门合计值的初值*/
      while(q!=NULL) /*内循环开始*/
      {
	 memcpy(qno,q->no,6); /*读部门号*/
	 qno[6]='\0'; /*做字符串结束标记*/
	 if(strcmp(qno,sno)==0) /*比较部门号*/
	 {
	    s1+=q->sfgz; /*累加实发工资*/
	    q=q->next; /*指针指向下一条记录*/
	 }
	 else
	    break; /*不是一个部门的结束本次内循环*/
      }
      strcpy(unit[i].u,sno); /*将部门号写入部门结构体数组中*/
      unit[i].s=s1;    /*将实发工资写入部门结构体数组中*/
      i++;       /*部门数累加*/
      if(q==NULL)  /*如果q为空,跳出循环*/
	 break;
      else
	 p=q;   /*否则,将q赋值给p*/
   }
   printf("\n\n**************Total table**************\n");/*输出合计标题*/
   printf("\n--no-------unit------------total---------\n"); /*输出序号、部门、合计字段标题*/
   for(j=0;j<i;j++)
      printf("   %d        %s             %10.2f\n",j,unit[j].u,unit[j].s); /*输出合计值*/
   printf("----------------------------------------\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -