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

📄 gongziguanli.txt

📁 工资管理系统
💻 TXT
📖 第 1 页 / 共 3 页
字号:
      print(p);   /*调用输出函数显示头结点信息*/
      for(;;)  /*循环开始*/
      {
	 printf("\n\n0. Quit 1. Prior      2.  Next      3.  First        4.Last \n\n");
/*菜单项Quit退出 Prior前驱 Next后继  First第一条 Last最后一条*/
	 printf("\nplease select 0~4:"); /*提示输入菜单选项0~4*/
	 scanf("%d",&ch); /*输入菜单选项0~4*/
	 if(ch==0) break;  /*如果选项为0,退出*/
	 switch(ch)   /*开关语句根据选项字符判断*/
	 {
	    case 1:p=p->prior;if(p==NULL)p=First;break;  /*指向前驱,没有前驱指向第一个*/
	    case 2:p=p->next;if(p==NULL) p=Last;break; /*指向后继,没有后继指向最后一个*/
	    case 3:p=First;break;  /*指向第一个结点*/
	    case 4:p=Last;break; /*指向最后一个结点*/
	 }
	 print(p);  /*调用输出函数显示指针所指结点信息*/
      }
   }
}
/*输出指针所指结点信息*/
void print(SALARY *p)
{
   if(p)   /*如果指针不为空,则显示信息*/
   {
      clrscr();  /*清屏*/
      printf("\n\n\n");  /*换行*/
      printf("************************************SALARY************************************\n");  /*输出标题信息*/
      printf("|no        |      name     |   jbgz  | koukuan|   yfgz  | shuijin |   sfgz   |\n"); /*输出字段标题*/
      printf("|----------|---------------|---------|---------|---------|---------|---------|\n"); /*输出分割线*/
      printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n", p->no,p->name,
      p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);/*输出结点信息*/
      printf("***************************************end***************************** *******\n");  /*输出结束标记*/
   }
}
/*计算实发工资*/
void calc()
{
   int x; /*行坐标*/
   int i=0; /*记录数*/
   float temp; /*临时变量扣款*/
   SALARY *p;  /*移动指针*/
   clrscr();   /*清屏*/
   p=First;  /*从头指针开始*/
   while(p!=NULL)  /*当p不为空时,也就是有记录时,外循环控制换页*/
   {
      x=0;
      clrscr();
      gotoxy(1,3);
      printf("***************************gongziguanli************************************");   /*输出标题*/
      gotoxy(1,5);
      printf("|--------------------------------------------------------------------------|");
      gotoxy(1,6);/*下面输出字段标题*/
      printf("|    no    |      name      |  jbgz  |  koukuan |  yfgz  |shuijin |  sfgz  |");
      while(p!=NULL) /*当p不为空时,也就是有记录时,内循环控制处理9条*/
      {
	 gotoxy(1,7+x);
	 printf("|----------|----------------|--------|----------|--------|--------|--------|");
	 gotoxy(1,8+x);printf("|");
	 gotoxy(12,8+x);printf("|");
	 gotoxy(29,8+x);printf("|");
	 gotoxy(38,8+x);printf("|");
	 gotoxy(49,8+x);printf("|");
	 gotoxy(58,8+x);printf("|");
	 gotoxy(67,8+x);printf("|");
	 gotoxy(76,8+x);printf("|");
	 gotoxy(2,8+x);
	 printf("%-10s",p->no); /*输出编号*/
	 gotoxy(13,8+x);
	 printf("%-15s",p->name); /*输出姓名*/
	 gotoxy(30,8+x);
	 printf("%.2f",p->jbgz);  /*输出基本工资*/
	 gotoxy(39,8+x);
	 scanf("%f",&temp);  /*输入扣款*/
	 p->koukuan=temp; /*扣款字段赋值*/
	 p->yfgz=p->jbgz-p->koukuan; /*计算应发工资=基本工资-扣款*/
	 gotoxy(50,8+x);
	 printf("%.2f",p->yfgz);  /*输出应发工资*/
	 gotoxy(59,8+x);
	 p->shuijin=(p->yfgz-1000)*fax(p->yfgz); /*否则按税率计算税金*/
	 printf("%.2f",p->shuijin);  /*输出税金*/
	 gotoxy(68,8+x);
	 p->sfgz=p->yfgz-p->shuijin;  /*计算实发工资*/
	 printf("%-8.2f",p->sfgz);  /*输出实发工资*/
	 x+=2;   /*行坐标下移两行*/
	 i++;   /*记录数加1*/
	 if(i%9==0)break;  /*记录数超过9条,跳出内循环*/
	 p=p->next;   /*指针后移,处理下一条*/
      }
      gotoxy(1,7+x);
      printf("|----------|----------------|--------|----------|--------|--------|--------|\n"); /*输出结束行*/
      printf("Press any key congtinue...\n");
      getch();
   }
}
/*根据应发工资,计算税率*/
float fax(float x)
{
   float f1;
   if(x<1000)
      return 0;   /*小于1000,返回0*/
   switch((int)(x/1000))
   {
      case 1:f1=0.05;break; /*1000~1999,返回0.05*/
      case 2:f1=0.1;break; /*2000~2999,返回0.1*/
      case 3:f1=0.15;break; /*3000~3999,返回0.15*/
      case 4:f1=0.2;break; /*4000~4999,返回0.2*/
      default:f1=0.3;break; /*5000以上,返回0.3*/
   }
   return f1;
}
/*计算票面张数*/
void computer()
{
   SALARY *p;
   int i=0,a[7]={0},t100,t50,t20,t10,t5,t2,t1;/*设置数组和临时变量保存票面张数*/
   float t;   /*过渡变量,保存当前剩余工资*/
   p=First;  /*移动指针从头指针开始*/
   while(p!=NULL)  /*当p不为空时*/
   {
      t100=(int)p->sfgz/100;  /*计算100元张数*/
      a[0]=a[0]+t100;   /*累加保存*/
      t=p->sfgz-t100*100; /*剩余工资*/
      t50=(int)(t/50); /*计算50元张数*/
      a[1]=a[1]+t50; /*累加保存*/
      t=t-t50*50; /*剩余工资*/
      t20=(int)(t/20);   /*计算20元张数*/
      a[2]=a[2]+t20; /*累加保存*/
      t=t-t20*20; /*剩余工资*/
      t10=(int)(t/10); /*计算10元张数*/
      a[3]=a[3]+t10; /*累加保存*/
      t=t-t10*10; /*剩余工资*/
      t5=(int)(t/5); /*计算5元张数*/
      a[4]=a[4]+t5; /*累加保存*/
      t=t-t5*5; /*剩余工资*/
      t2=(int)(t/2); /*计算2元张数*/
      a[5]=a[5]+t2; /*累加保存*/
      t=t-t2*2; /*剩余工资*/
      t1=(int)(t); /*计算1元张数*/
      a[6]=a[6]+t1; /*累加保存*/
      p=p->next;  /*指针后移,处理下一条记录*/
   }
   clrscr();  /*清屏*/
   printf("\n\n\n***********ticket number***************\n"); /*输出标题*/
   printf("--100-----50------20-----10-----5------2------1------\n");
     /*输出张数标题*/
   for(i=0;i<7;i++)
      printf("%5d  ",a[i]);/*输出所需的张数*/
   printf("\n");/*换行*/
}
/*按编号查找记录*/
SALARY *find(char *no)
{
   SALARY *p; /*定义移动指针*/
   p=First;  /*从头指针开始*/
   while(p) /*当p不为空时*/
   {
      if(!strcmp(no,p->no))
	 return p; /*比较相等,查找成功,返回指针*/
      p=p->next; /*不相等指针后移*/
   }
   printf("not found\n");  /*没有找到*/
   return NULL; /*返回为空指针*/
}
/*删除结点*/
void delete()
{
   SALARY *p; /*定义临时变量,p指向要删除的结点p*/
   char s[11]; /*要删除结点的编号*/
   clrscr();  /*清屏*/
   printf("please deleted no\n"); /*提示输入信息*/
   scanf("%s",s);   /*输入要删除的职工编号*/
   if((p=find(s))!=NULL) /*调用查找函数,如果找到做下面的处理*/
   {
      if(First==p)    /*如果是第一个结点*/
      {
	 First=p->next;  /*将头指针指向其后继结点*/
	 if(First)    /*如头指针不为空*/
	    First->prior=NULL;  /*将头结点的前驱设为空*/
	 else
	    Last=NULL;   /*否则头为空,尾也为空*/
      }
      else   /*删除的不是第一个结点*/
      {
	 p->prior->next=p->next;  /*p的前驱的后继指向p原来的后继*/
	 if(p!=Last)   /*如果p不是最后个结点*/
	    p->next->prior=p->prior;  /*p后继的前驱指向p原来的前驱*/
	 else
	    Last=p->prior;/*如p是最后一个结点,修改尾指针为p的前驱*/
      }
      free(p);  /*删除结点后,不要忘记释放空间*/
      printf("\n have deleted %s SALARY\n",s);
      printf("Don't forget save\n");
   }
}
/*按姓名查找结点*/
void search()
{
   SALARY *p;  /*移动指针*/
   char s[15];  /*保存姓名*/
   clrscr(); /*清屏*/
   printf("please enter name for search\n"); /*提示输入*/
   scanf("%s",s);  /*输入要查找人的姓名*/
   p=First;  /*移动指针从头指针开始*/
   while(strcmp(p->name,s)&&p!=NULL) /*做比较判断*/
      p=p->next;   /*没找到,指针后移继续查找*/
   if(p==NULL)  /*指针为空,说明没有找到*/
      printf("\nlist no %s SALARY\n",s); /*显示没找到信息*/
   else
   {
      printf("\n\n"); /*换行*/
      print(p);  /*查找成功,调用输出函数输出指针p所指记录*/
   }
}
/*插入结点*/
void insert()
{
   SALARY *p,*info; /* info为新结点,p为新结点的后继*/
   char s[11];  /*保存查找的姓名*/
   float temp; /*临时变量*/
   clrscr(); /*清屏*/
   printf("please enter location  before the no\n"); /*提示输入在哪个结点之前插入*/
   scanf("%s",s);  /*输入指定结点的编号*/
   printf("\nplease new record\n");  /*提示输入记录*/
   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("|----------|----------------|--------|");
   p=First;  /*移动指针从头指针开始*/
   while(strcmp(p->no,s)&&p!=NULL) /*查找结点确定插入位置*/
      p=p->next;  /*指针后移,继续查找*/
   if(p==NULL)  /*如p为空*/
      if(p==First) /*如p为头指针,说明链表为空*/
      {
	 First=info;  /*新结点为头指针*/
	 First->prior=NULL; /*头结点的前驱为空*/
	 Last=First;  /*唯一结点,尾指针等于头指针*/
      }
      else  /*新结点插在尾部*/
      {
	 Last->next=info;
	 info->prior=Last;
	 Last=info;  /*尾指针指向新结点*/
      }
   else
      if(p==First)  /*p不为空,但p为头指针,新结点插在第一个结点位置*/
      {
	 info->prior=NULL; /*新结点的前驱为空*/
	 info->next=p; /*新结点的后继为p*/
	 p->prior=info; /*p的前驱是新结点*/
	 First=info; /*修改头指针指向新结点*/
      }
      else /*新结点插入在中间某一个位置p之前*/
      {
	 info->next=p; /*新结点的后继是p*/
	 info->prior= p->prior; /*新结点的前驱是p的前驱*/
	 p->prior->next=info; /*p的前驱的后继是新结点*/
	 p->prior=info; /*p的前驱是新结点*/
      }
   printf("\n\n\n ----have inserted %s SALARY----\n",info->name);
   printf("\n---Don't forget save---\n"); /*提醒调用保存文件存盘*/
}
/*保存文件*/

⌨️ 快捷键说明

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