打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
c12
/*12.3.2 源程序*/
/******头文件(.h)***********/
#include "stdio.h"    /*I/O函数*/
# include "bios.h"  /*ROM基本输入输出函数*/
#include "dos.h"    /*dos接口函数*/
#include "conio.h"   /*屏幕操作函数*/
#include "stdlib.h"   /*其它说明*/
#include "string.h"  /*字符串函数*/
#include "mem.h"  /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h"  /*动态地址分配函数*/
/****变量定义*******/
typedef struct z1    /*定义数据结构*/
{
   char no[11];     /*编号*/
   char name[15];  /*姓名*/
   float jbgz;     /*基本工资*/
   float koukuan; /*扣款*/
   float yfgz;  /*应发工资*/
   float shuijin;  /*税金*/
   float sfgz;   /*实发工资*/
   struct z1 *prior;/*前驱指针*/
   struct z1 *next;/*后继指针*/
}SALARY;     /*结构体类型名*/
struct z1 *First;   /*双链表头指针*/
struct z1 *Last;   /*双链表尾指针*/
/******函数原型*********/
void init();    /*初始化*/
void create();  /*创建链表*/
void calc();   /*计算应发工资*/
void delete(); /*删除*/
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);  /*计算税金*/
int menu_select();  /*主菜单*/
/*******主函数开始**********/
main()
{
   int i;
   clrscr();
   for(;;)
   {
      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:delete();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);    /*退出*/
      }
   }
}
/*菜单函数,函数返回值为整型,代表所选的菜单项*/
menu_select()
{
   char *f[]= {     /*定义菜单字符串数组*/
   "**************MENU*************", /*菜单的标题行*/
   " 0. init list", /*初始化双链表*/
   " 1. Enter list", /*输入数据,创建双链表*/
   " 2. List all \n",  /*显示所有记录*/
   " 3. Display record by step", /*显示单条记录*/
   " 4. Calc the salary", /*计算实发工资*/
   " 5. Search record on name", /*查找记录*/
   " 6. Delete a record", /*删除记录*/
   " 7. Insert record to list", /*插入记录*/
   " 8. Append  record to file", /*追加记录*/
   " 9. Save data to the file",  /*保存文件*/
   " 10. Load data from the file",/*读取文件*/
   " 11. Copy the file to new file", /*复制文件*/
   " 12. Sort on sfgz",  /*排序*/
   " 13. Computer ticket number", /*计算所需票面数*/
   " 14. Index on number",  /*索引*/
   " 15. Total on number",  /*分类合计*/
   " 16. Quit" };  /*退出*/
   char s[80];
   int  i;
   int key=0; /*记录所压键值*/
   int c=0;
   gotoxy(1,25); /*移动光标*/
   printf("press any key enter menu......\n");/*压任意键进入主菜单*/
   getch();
   clrscr();  /*清屏*/
   textcolor(YELLOW); /*设置文本颜色为黄色*/
   textbackground(BLUE);  /*设置背景颜色为兰色*/
   gotoxy(10,2);
   putch(0xda); /*输出左上角边框┏*/
   for(i=1;i<44;i++)
   putch(0xc4); /*输出上边框水平线*/
   putch(0xbf);  /*输出右上角边框  ┓*/
   for(i=3;i<22;i++)/*输出左右两边的垂直线*/
   {
      gotoxy(10,i);putch(0xb3);
      gotoxy(54,i);putch(0xb3);
   }
   gotoxy(10,22);putch(0xc0); /*输出左上角边框┗*/
   for(i=1;i<44;i++)
      putch(0xc4);  /*输出下边框水平线*/
   putch(0xd9);  /*输出右下角边框┛*/
   window(11,3,53,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/
   clrscr();   /*清屏*/
   for(i=0;i<18;i++)
   {
      gotoxy(10,i+1);
      cprintf("%s",f[i]); /*输出菜单项数组*/
   }
   i=1;
   gotoxy(10,2);  /*设置默认选项在第一项*/
   textbackground(LIGHTGREEN);/*设置背景颜色为浅绿*/
   cprintf("%s",f[1]);  /*输出菜单项,表示选中*/
   gotoxy(10,2);  /*移动光标到菜单的第一项*/
   while(key!=13)   /*所压键不是回车键时*/
   {
      while(bioskey(1)==0);  /*查询是否压下了一个键*/
      key=bioskey(0);   /*返回下一个在键盘压下的键*/
      key=key&0xff?key&0xff:key>>8; /*对所压的键进行判断*/
      gotoxy(10,i+1);
      textbackground(BLUE);/*设置背景颜色为蓝色*/
      cprintf("%s",f[i]);  /*输出菜单项*/
      if(key==72) i=i==1?17:i-1; /*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/
      if(key==80)i=i==17?1:i+1; /*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/
      gotoxy(10,i+1); /*光标移动i的下一项*/
      textbackground(LIGHTGREEN); /*将背景颜色设为浅绿*/
      cprintf("%s",f[i]);  /*输出菜单项*/
      c=i-1;  /*给代表菜单选项的整数赋值*/
   }
   textbackground(BLACK);  /*设置背景颜色为黑色*/
   window(1,1,80,25);  /*恢复原窗口大小*/
   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; /*如果flag=1,结束输入*/
      i=0;
      x=0;   /*确定移动的行坐标*/
      clrscr(); /*清屏*/
      gotoxy(1,3);
      printf("*************gongziguanli*************");/*输出标题*/
      gotoxy(1,4);
      printf("                      --Enter @ end--");/*提示输入@结束*/
      gotoxy(1,5);
      printf("|------------------------------------|");/*输出表格的起始线*/
      gotoxy(1,6);
      printf("|    no    |      name      |  jbgz  |");/*输出字段标题,注意空格数*/
      for(;;)
      {
  gotoxy(1,7+x);
  printf("|----------|----------------|--------|");/*输出表格的水平线*/
  info=(SALARY *)malloc(sizeof(SALARY));/*申请一个记录空间*/
  if(!info)
  {
     printf("\nout of memory");/*如没有得到空间,输出内存溢出信息*/
     exit(0);/*退出程序*/
  }
  info->next=NULL;/*新结点的后继为空*/
  info->prior=NULL;/*新结点的前驱为空*/
  gotoxy(1,8+x);printf("|"); /*输出数据间的分割线*/
  gotoxy(12,8+x);printf("|");
  gotoxy(29,8+x);printf("|");
  gotoxy(38,8+x);printf("|");
  gotoxy(2,8+x);/*光标到输入编号位置*/
  inputs(info->no,10);/*输入编号,并验证长度不超过10*/
  if(info->no[0]=='@')
  {
     flag=1;
     break;
  } /*编号首字符为@结束输入*/
  gotoxy(13,8+x);  /*光标到输入姓名位置*/
  inputs(info->name,14); /*输入姓名,并验证长度不超过14*/
  gotoxy(30,8+x); /*光标到输入基本工资位置*/
  scanf("%f",&temp); /*输入基本工资到临时变量*/
  info->jbgz=temp; /*基本工资赋值*/
  info->koukuan=0; /*初始扣款为0,待计算工资时输入*/
  info->sfgz=0; /*初始实发工资为0,待计算工资时计算*/
  info->shuijin=0; /*初始税金为0,待计算工资时计算*/
  info->yfgz=0; /*初始应发工资为0,待计算工资时计算*/
  if(p==NULL)/*如果p为空,说明输入的是第一个结点*/
  {
     First=Last=info;/*头指针和尾指针*/
     First->prior=NULL; /*头指针的前驱是空*/
     Last->next=NULL; /*尾指针的后继是空*/
  }
  else /*插入的结点不是第一结点,则插入在头结点之前*/
  {
     info->next=p;/*新结点的后继指向原来的头结点*/
     info->prior=p->prior;/*新结点的前驱指向原来的头结点的前驱*/
     p->prior=info;/*原来结点的前驱指向新结点*/
  }
  p=info;  /*新结点变为p结点,暂时的头结点*/
  First=info; /*新结点变为头结点*/
  x+=2;   /*因为水平线,将光标下移两行*/
  gotoxy(1,8+x);
  i++;   /*输入记录数加1*/
  if(i%9==0)
     break; /*输入9个记录,换一页输入*/
      }
      gotoxy(1,8+x);
   }
   printf("|----------|----------------|--------|");/*输出结尾水平线*/
}
/*字符串输入和验证函数*/
inputs(char *s, int count)
{
   char p[255];
   do{
      scanf("%s",p);/*输入字符串*/
      if(strlen(p)>count)printf("\n too long! \n");/*进行长度校验,超过count值重输入*/
   }while(strlen(p)>count);
   strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}
/*显示链表*/
void list()
{
   int i=0,n;  /*记录输出行数*/
   SALARY *p; /*定义移动指针*/
   clrscr();  /*清屏*/
   p=First;  /*从头指针开始*/
   while(i%10==0&&p!=NULL)  /*外循环控制换页*/
   {
      i=0;       /*记录一页的输出行数*/
      clrscr();   /*清屏*/
      printf("\n\n\n"); /*换行三次*/
      printf("*************************************SALARY***********************************\n");   /*输出大标题*/
      printf("|nO        |      name     |   jbgz  | koukuan |   yfgz  | shuijin |   sfgz  |\n");  /*输出字段标题*/
      printf("|----------|---------------|---------|---------|---------|---------|---------|\n");  /*输出水平线*/
      while(p!=NULL)  /*当p不为空时*/
      {
  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++;   /*输出行数加1 */
  if(i%10==0)
     break;  /*如果满10行,跳出内循环*/
      }
      printf("****************************************end***********************************\n");  /*输出本页的结束行*/
      printf("Press any key congtinue...\n");
      getch(); /*输出一页暂停一下,压任意键继续*/
   }  /*返回到外循环,准备下一页的输出*/
}
/*单条显示记录*/
void display()
{
   int ch;   /*菜单选项字符*/
   SALARY *p;  /*定义临时指针*/
   clrscr();  /*清屏*/
   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");
/*菜单项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不为空时*/
   {
     
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
学生成绩管理系统(C语言)
链表
C语言难点分析整理
数据结构之线性表
链表的简单创建
【转载】C/C++的面试题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服