工资管理系统

//本程序主要采用链表,结合文件的操作实现
#include<stdio.h> 
#include<dos.h>  
#include<conio.h> 
#include<stdlib.h>
#include<string.h>
#include<mem.h>
#include<ctype.h>
#include<malloc.h>
 
typedef struct GZ  
{
   char no[11];     //编号
   char name[15];  //姓名
   float jbgz;     //基本工资
   float koukuan; //扣款
   float yfgz;  //应发工资
   float shuijin;  //税金
   float sfgz;   //实发工资
   struct GZ *prior;//前驱指针
   struct GZ *next;//后继指针
}SALARY;     //结构体类型名
struct GZ *First;   //双链表头指针
struct GZ *Last;   //双链表尾指针


void init();    //初始化
void create();  //创建链表
void calc();   //计算应发工资
void delet(); //删除
void search(); //查找
void save();  //保存文件
void load();  //读取文件
void computer(); //计算所需各种票面张数
void insert();  //插入
void append(); //追加
void copy(); //复制文件
void sort();  //排序
void index();  //索引
void total();  //分类合计
void list(); //显示所有数据
void print(SALARY *p);  //输出单条记录
void display();  //随意逐条显
float fax(float x);  //计算税金
void inputs(char *s, int count);
int menu_select();  //主菜单


main()
{
 system("COLOR 8a");
   for(;;)
   {
    system("cls");
    switch(menu_select())
    {
    case 0:init();break;    //初始化
    case 1:create();break; //输入数据创建双链表
    case 2:list();break;  //显示所有数据
    case 3:display();break;  //单条显示
    case 4:calc();break;  //计算实发工资
    case 5:search();break;  //查找职工信息数据
    case 6:delet();break;  //删除记录
    case 7:insert();break;  //插入记录
    case 8:append();break;  //追加记录
    case 9:save();break;  //保存文件
    case 10:load(); break;  //读取文件
    case 11:copy();break;  //复制文件
    case 12:sort();break;  //按实发工资升序排序
    case 13:computer();break; //计算所需票面数
    case 14:index();break;  //按职工号索引
    case 15:total();break;  //按部门求合计
    case 16:exit(0);    //退出
      }
   }
   return 0;
}


int menu_select()
{
 printf("*****************菜单**************************\n");
 printf("|0. 初始化双链表  ||   1. 输入数据,创建双链表|\n");
 printf("|2. 显示所有记录  ||   3. 显示单条记录        |\n");
 printf("|4. 计算实发工资  ||   5. 查找记录            |\n");
 printf("|6. 删除记录      ||   7. 插入记录            |\n");
 printf("|8. 追加记录      ||   9. 保存文件            |\n");
 printf("|10. 读取文件     ||   11.复制文件            |\n");
 printf("|12. 排序         ||   13. 计算所需票面数     |\n");
 printf("|14. 索引         ||   15. 分类合计           |\n");
 printf("**************16. 退出*************************\n");
   int c;
   printf("please input choice:\n");
   scanf("%d",&c);
   return c; 
}

void init()
{
   First=NULL;
   Last=NULL;
}

void create()
{
   int x;
   int i;
   int flag=0;
   float temp;
   SALARY *info,*p;
   if(First!=NULL)
   init();
   p=First;
   for(;;)
   {
      if(flag==1)
    break;
      i=0;
      x=0;
      printf("*************工资管理*************\n");
      printf("-------------输入 @ 结束--------------\n");
      printf("|------------------------------------|\n");
      printf("|    no    |      name      |  jbgz  |\n");
      for(;;)
      {
    printf("|----------|----------------|--------|\n");
    info=(SALARY *)malloc(sizeof(SALARY));
    if(!info)
    {
     printf("\nout of memory");
     exit(0);
    }
    info->next=NULL;
    info->prior=NULL;
    inputs(info->no,10);
    if(info->no[0]=='@')
    {
     flag=1;
     break;
    }
    inputs(info->name,14);
    scanf("%f",&temp);
    info->jbgz=temp;
    info->koukuan=0;
    info->sfgz=0;
    info->shuijin=0;
    info->yfgz=0;
    if(p==NULL)
    {
     First=Last=info;
     First->prior=NULL;
     Last->next=NULL;
    }
    else
    {
     info->next=p;
     info->prior=p->prior;
     p->prior=info;
    }
    p=info;
    First=info;
    i++;
    if(i%9==0)
     break;
      }
   }
   printf("|----------|----------------|--------|\n");
}

void inputs(char *s, int count)
{
   char p[255];
   do{
      scanf("%s",p);
      if(strlen(p)>count)
          printf("\n too long! \n");
   }while(strlen(p)>count);
   strcpy(s,p);
}

void list()
{
   int i=0;
   SALARY *p;
   p=First;
   while(i%10==0&&p!=NULL)
   {
      i=0;
      printf("\n\n\n");
      printf("*************************************工资*************************************\n"); 
      printf("|nO        |      name     |   jbgz  | koukuan |   yfgz  | shuijin |   sfgz  |\n");
      printf("|----------|---------------|---------|---------|---------|---------|---------|\n");
      while(p!=NULL)
      {
  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);
  p=p->next;
  i++;
  if(i%10==0)
     break;
      }
      printf("****************************************结束***********************************\n");
      printf("Press any key congtinue...\n");
      getch();
   }
}

void display()
{
   int ch; 
   SALARY *p;
   p=First;
   if(p==NULL) 
   {
      printf("record is empty!\n");
      return;
   }
   else
   {
      print(p);
      for(;;) 
      {
  printf("\n\n0. Quit 1. Prior      2.  Next      3.  First        4.Last \n\n");
  printf("\nplease select 0~4:");
  scanf("%d",&ch);
  if(ch==0) break;
  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)  
   {
      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;
   p=First; 
   while(p!=NULL)
   {
      x=0;
      printf("***************************工资管理系统************************************");
      printf("|--------------------------------------------------------------------------|");
      printf("|    no    |      name      |  jbgz  |  koukuan |  yfgz  |shuijin |  sfgz  |");
      while(p!=NULL)
      {
    printf("|----------|----------------|--------|----------|--------|--------|--------|");
    printf("%-10s",p->no);
    printf("%-15s",p->name);
    printf("%.2f",p->jbgz);
    scanf("%f",&temp);
    p->koukuan=temp;
    p->yfgz=p->jbgz-p->koukuan;
    printf("%.2f",p->yfgz);
    p->shuijin=(p->yfgz-1000)*fax(p->yfgz);
    printf("%.2f",p->shuijin);
    p->sfgz=p->yfgz-p->shuijin;
    printf("%-8.2f",p->sfgz);
    x+=2;
    i++;
    if(i%9==0)
     break;
    p=p->next;
      }
      printf("|----------|----------------|--------|----------|--------|--------|--------|\n");
      printf("Press any key congtinue...\n");
      getch();
   }
}

float fax(float x)
{
   float f1;
   if(x<1000)
      return 0;
   switch((int)(x/1000))
   {
      case 1:f1=0.05;break;//1000-2000,税率0.05
      case 2:f1=0.1;break;
      case 3:f1=0.15;break;
      case 4:f1=0.2;break;
      default:f1=0.3;break;
   }
   return f1;
}

void computer()//计算票面张数
{
   SALARY *p;
   int i=0,a[7]={0},t100,t50,t20,t10,t5,t1;
   float t; 
   p=First; 
   while(p!=NULL)
   {
      t100=(int)p->sfgz/100; 
      a[0]=a[0]+t100;  
      t=p->sfgz-t100*100;
      t50=(int)(t/50);
      a[1]=a[1]+t50;
      t=t-t50*50;
      t20=(int)(t/20);  
      a[2]=a[2]+t20;
      t=t-t20*20;
      t10=(int)(t/10);
      a[3]=a[3]+t10;
      t=t-t10*10;
      t5=(int)(t/5);
      a[4]=a[4]+t5;
      t=t-t5*5;
      t1=(int)(t);
      a[5]=a[5]+t1;
      p=p->next;
   }
   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)
   {
      if(!strcmp(no,p->no))
         return p;
      p=p->next;
   }
   printf("not found\n");
   return NULL;
}
void delet()
{
   SALARY *p;
   char s[11];
   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;
  if(p!=Last)  
     p->next->prior=p->prior;
  else
     Last=p->prior;
      }
      free(p); 
      printf("\n have deleted %s SALARY\n",s);
      printf("Don't forget save\n");
   }
}

void search()
{
   SALARY *p; 
   char s[15];
   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); 
   }
}


void insert()
{
   SALARY *p,*info;
   char s[11];
   float temp;
   printf("please enter location  before the no\n");
   scanf("%s",s);
   printf("\nplease new record\n");
   printf("**************工资管理***************");
   printf("|------------------------------------|");
   printf("|    no    |      name      |  jbgz  | ");
   printf("|----------|----------------|--------|");
   info=(SALARY *)malloc(sizeof(SALARY));
   if(!info)
   {
      printf("\nout of memory");
      exit(0);
   }
   info->next=NULL;
   info->prior=NULL;
   inputs(info->no,10);
   inputs(info->name,14);
   scanf("%f",&temp);
   info->jbgz=temp;
   info->koukuan=0;
   info->yfgz=0;
   info->shuijin=0;
   info->sfgz=0;
   printf("|----------|----------------|--------|");
   p=First;
   while(strcmp(p->no,s)&&p!=NULL)
      p=p->next;
   if(p==NULL)
      if(p==First)
      {
  First=info;
  First->prior=NULL;
  Last=First;
      }
      else 
      {
  Last->next=info;
  info->prior=Last;
  Last=info;
      }
   else
      if(p==First) 
      {
  info->prior=NULL;
  info->next=p;
  p->prior=info;
  First=info;
      }
      else
      {
  info->next=p;
  info->prior= p->prior;
  p->prior->next=info;
  p->prior=info;
      }
   printf("\n\n\n ----have inserted %s SALARY----\n",info->name);
   printf("\n---Don't forget save---\n");
}


void save()
{
   FILE *fp; 
   SALARY *p;
   char outfile[10];
   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)
   {
      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];
   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;
   while(!feof(fp))
   {
      if(1!=fread(p,sizeof(SALARY),1,fp))break;
      p->next=(SALARY *)malloc(sizeof(SALARY));
      if(!p->next)
      {
  printf("out of memory!\n");
  return;
      }
      p->prior=q;
      q=p;
      p=p->next;
   }
   q->next=NULL;
   Last=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;
   printf("**************工资管理系统************");
   printf("|------------------------------------|");
   printf("|    no    |      name      |  jbgz  | ");
   printf("|----------|----------------|--------|");
   info=(SALARY *)malloc(sizeof(SALARY));
   if(!info)
   {
      printf("\nout of memory");
      exit(0);
   }
   info->next=NULL; 
   info->prior=NULL;
   inputs(info->no,10);
   inputs(info->name,14);
   scanf("%f",&temp);
   info->jbgz=temp;
   info->koukuan=0;
   info->yfgz=0;
   info->shuijin=0;
   info->sfgz=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");
      return; 
   }
   printf("-----append  sucess!!----\n");
   fclose(fp);
}
void copy()
{
   char outfile[10],infile[10];
   FILE *sfp,*tfp; 
   SALARY *p=NULL; 
   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; 
   printf("\n\n start sort....\n");
   p1=p11=p2=First;
   while(p1!=NULL)
   {
      p0=p1;   
      p2=p1;  
      while(p2->next!=NULL)
      {
  if(p0->sfgz>p2->next->sfgz) 
  {
     p00=p2; 
     p0=p2->next;
  }
  p2=p2->next;
      }
      Last=p0;
      if(p1!=p0)
      {
  p00->next=p0->next; 
  p0->next->prior=p00;
  p0->next=p1; 
  p1->prior=p0;
  if(i==1)
  {
     First=p0; 
     First->prior=NULL;
  }
  else
  {
     p11->next=p0;  
     p0->prior=p11;
  }
  p11=p1=p0;
      }
      i++;
      p1=p1->next;
   }
   printf("sort sucess!!!\n");
}


void index()
{
   SALARY *p,*q,*t,*h1;
   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;
      q=First;
      while(strcmp(t->no,p->no)>0&&p!=NULL)
      {
  q=p;
  p=p->next;
      }
      if(p==q)
      {
  t->next=p;
  p->prior=t;
  First=t;
  First->prior=NULL;
      }
      else
      {
  t->next=p;
  t->prior=q;
  q->next=t;
  if(p==NULL)
     Last=t;  
  else
     p->prior=t;
      }
   }
   printf("index success!!!\n");
}

void total()
{
   struct t1
   {
      char u[7]; 
      float s; 
   }unit[20]; 
   SALARY *p,*q; 
   char sno[7],qno[7],*ptr;
   float s1;
   int i,j; 
   p=First; 
   i=0; 
   while(p!=NULL)
   {
      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)
  break;
      else
  p=q;
   }
   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");
}

 

转载于:https://www.cnblogs.com/hqcao/archive/2012/11/25/2787955.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值