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

📄 wage.c

📁 自编工资管理系统
💻 C
📖 第 1 页 / 共 3 页
字号:
//包含文件
#include "stdio.h"    /*I/O函数*/
# include "bios.h"  /*ROM基本输入输出函数*/
#include "dos.h"    /*dos接口函数*/
#include "conio.h"   /*屏幕操作函数*/
#include "stdlib.h"   /*其它说明*/
#include "process.h"
#include "string.h"  /*字符串函数*/
#include "mem.h"  /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h"  /*动态地址分配函数*/

//变量及结构定义
typedef struct UserInfo    /*定义数据结构*/
{
    //员工编号
    char UserNo[10];
    //姓名
    char UserName[20];
	//工资
    float Wage;
	//其他工资信息
    float OtherWage;
	//员工链表结构前驱指针
    struct UserInfo *prior;
	//员工链表结构后继指针
    struct UserInfo *next;
}user;
//管理员信息存储结构
typedef struct AdminInfo
{
	char AdminName[20];
	char Password[10];
}Admin;

//结构定义
struct UserInfo *First;   
struct UserInfo *Last;


//Esc 按键定义
#define  ESC 0x001b  /* 退出 */
#define  NULL 0

//初始化函数
void Initial()
{
	First=NULL;
	Last=NULL;
}
    
//输入数据,创建双链表
void CreateUser()
{
   int x; /*记录行坐标*/
   int i; /*记录输入记录数*/
   int flag=0; /*做结束标记*/
   float temp;   /*定义临时变量*/
   user *info,*p;
   if(First!=NULL)
   {
		Initial();/*如果头指针为空,调用初始化函数*/
   }
   p=First; /*从头指针开始*/
   for(;;)
   {
      if(flag==1)
         break; /*如果flag=1,结束输入*/
      i=0;
      x=0;   /*确定移动的行坐标*/
      clrscr(); /*清屏*/

      gotoxy(1,6);
      printf("\t\t|***************WageManage System************|");/*输出标题*/
	  gotoxy(1,7);
      printf("\t\t      |-----------------Create User----------------|");
      gotoxy(1,8);
	  printf("\t\t    |------------------------------Input # to end|");/*提示输入@结束*/
      gotoxy(1,9);
      printf("                |--------------------------------------------|");/*输出表格的起始线*/
      gotoxy(1,10);
      printf("\t\t|  UserNo  |      UserName      |    Wage    |");/*输出字段标题,注意空格数*/
      for(;;)
      {
	     gotoxy(1,11+x);
	     printf("                |----------|--------------------|------------|");/*输出表格的水平线*/
         info=(user *)malloc(sizeof(user));/*申请一个记录空间*/
         if(!info)
         {
            printf("\n out of memory");/*如没有得到空间,输出内存溢出信息*/
            exit(0);/*退出程序*/
         }
         info->next=NULL;/*新结点的后继为空*/
         info->prior=NULL;/*新结点的前驱为空*/

	     gotoxy(17,12+x); printf("|"); /*输出数据间的分割线*/
	     gotoxy(28,12+x);printf("|");
	     gotoxy(49,12+x);printf("|");
	     gotoxy(62,12+x);printf("|");
	     gotoxy(18,12+x);/*光标到输入编号位置*/
         inputs(info->UserNo,10);/*输入编号,并验证长度不超过10*/
		 if(info->UserNo[0] == '#')
         {
            flag=1;
            break;
         } /*编号首字符为#结束输入*/
	     gotoxy(29,12+x);  /*光标到输入姓名位置*/
	     inputs(info->UserName,20); /*输入姓名,并验证长度不超过14*/
	     gotoxy(50,12+x); /*光标到输入基本工资位置*/
         scanf("%f",&temp); /*输入基本工资到临时变量*/
         info->Wage=temp; /*基本工资赋值*/
         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(17,12+x);
		 i++;   /*输入记录数加1*/
		 if(i%9==0)
				break; /*输入9个记录,换一页输入*/
      }
      gotoxy(17,12+x);
   }
   printf("|----------|--------------------|--------|");/*输出结尾水平线*/
}

/*字符串输入和验证函数*/
inputs(char *s, int count)
{
   char p[50];
   do
   {
      scanf("%s",p);/*输入字符串*/
      if(strlen(p)>count)
	  {
         printf("\n too long! \n");/*进行长度校验,超过count值重输入*/
	  }
   }
   while(strlen(p)>count);
   strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}

/*显示链表*/
int List()
{
   int i=0,n;  /*记录输出行数*/
   user *p; /*定义移动指针*/
   clrscr();  /*清屏*/
   p=First;  /*从头指针开始*/
   if(p == NULL)
   {
	   printf("\n\n\n\n\n\n");
	   printf("\t\t User List is null,please press any key to return and create it");
	   getch();
	   return 1;
   }
   while(i%10==0&&p!=NULL)  /*外循环控制换页*/
   {
      i=0;       /*记录一页的输出行数*/
      clrscr();   /*清屏*/
      printf("\n\n\n\n\n\n");
      printf("\t\t******************WageManage System******************\n");   /*输出大标题*/
      printf("\t\t|   UserNo |      UserName      |   Wage  |OtherWage|\n");  /*输出字段标题*/
      printf("\t\t|----------|--------------------|---------|---------|\n");  /*输出水平线*/
	 
      while(p!=NULL)  /*当p不为空时*/
      {
         printf("\t\t|%-10s|%-20s|%9.2f|%9.2f|\n",
			 p->UserNo,p->UserName,p->Wage,0.00);
         p=p->next;  /*指针后移*/
         i++;   /*输出行数加1 */
         if(i%50==0)
            break;  /*如果满50行,跳出内循环*/
      }
      printf("\t\t***********************end***************************\n");  /*输出本页的结束行*/
	  printf("\n\n\n\n");
      printf("\t\t Press any key to return......");
      getch(); /*输出一页暂停一下,压任意键继续*/
   }  /*返回到外循环,准备下一页的输出*/
   return 0;
}

//输出指针所指结点信息
void Print(user *p)
{
   if(p)   /*如果指针不为空,则显示信息*/
   {
      clrscr();  /*清屏*/
      printf("\n\n\n\n\n\n");  /*换行*/
      printf("\t\t **************WageManage System*****************\n");  /*输出标题信息*/
      printf("\t\t |  UserNo  |    UserName   |   Wage  |OtherWage|\n"); /*输出字段标题*/
      printf("\t\t |----------|---------------|---------|---------|\n"); /*输出分割线*/
      printf("\t\t |%-10s|%-15s|%9.2f|%9.2f|\n", p->UserNo,p->UserName,
      p->Wage,0.00);/*输出结点信息*/
      printf("\t\t **********************end***********************\n");  /*输出结束标记*/
	  printf("\n\n\n");
   }
}

/*单条显示记录*/
void Display()
{
   int ch,key;   /*菜单选项字符*/
   user *p;  /*定义临时指针*/
   clrscr();  /*清屏*/
   p=First;  /*从头指针开始*/
   if(p==NULL)  /*指针为空,即链表为空,返回主函数*/
   {
      printf("record is empty!\n");
      return;
   }
   else
   {
      Print(p);   /*调用输出函数显示头结点信息*/
      for(;;)  /*循环开始*/
      {
          printf("\n\n\n");
          printf("\t\t 0. Quit\n");
		  printf("\t\t 1. Prior\n");
		  printf("\t\t 2. Next\n");
		  printf("\t\t 3. First\n");
		  printf("\t\t 4. Last\n");
          /*菜单项Quit退出 Prior前驱 Next后继  First第一条 Last最后一条*/
          printf("\t\t Please select 0-4:"); /*提示输入菜单选项0~4*/
		  key=GetKey();     /*调用自定义函数,读取一个键*/
          switch(key)
          {
		      case 49: p=p->prior;if(p==NULL)p=First;break;  /*指向前驱,没有前驱指向第一个*/
              case 50: p=p->next;if(p==NULL) p=Last;break; /*指向后继,没有后继指向最后一个*/
			  case 51: p=First;break;  /*指向第一个结点*/
			  case 52: p=Last;break; /*指向最后一个结点*/
              case 48: return;
          }
          Print(p);  /*调用输出函数显示指针所指结点信息*/
	  }
   }
}

/*按编号查找记录*/
user *FindbyNo(char *No)
{
   user *p; /*定义移动指针*/
   p=First;  /*从头指针开始*/
   while(p) /*当p不为空时*/
   {
      if(!strcmp(No,p->UserNo))
         return p; /*比较相等,查找成功,返回指针*/
      p=p->next; /*不相等指针后移*/
   }
   return NULL; /*返回为空指针*/
}

/*删除结点*/
void DeleteUser()
{
   user *p; /*定义临时变量,p指向要删除的结点p*/
   char s[10]; /*要删除结点的编号*/
   clrscr();  /*清屏*/
   printf("\n\n\n\n\n");
   printf("\t\t Please Input UserNo to delete:"); /*提示输入信息*/
   printf("\n\n\n");
   gotoxy(18,12);
   scanf("%s",s);   /*输入要删除的职工编号*/
   if((p=FindbyNo(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\n\n");
      printf("\t\t Delete User %s success\n",s);
      printf("\n\n\n");
	  printf("\t\t Press any key to return......");
	  getch();
   }
   else
   {
	   printf("\n\n\n");
       printf("\t\t The UserNo %s isn't exist",s);
       printf("\n\n\n");
	   printf("\t\t Press any key to return......");
	   getch();
   }
}

/*按员工编号查找结点*/
void Search()
{
    user *p;  /*移动指针*/
    char s[10];  /*保存员工编号*/
    clrscr(); /*清屏*/
	printf("\n\n\n\n\n\n");
	printf("\t\t Please input UserNo to search:"); /*提示输入*/
	printf("\n\n\n");
	gotoxy(18,10);
    scanf("%s",s);  /*输入要查找人的编号*/
    p=First;  /*移动指针从头指针开始*/
    while(strcmp(p->UserNo,s)&&p!=NULL) /*做比较判断*/
    p=p->next;   /*没找到,指针后移继续查找*/
    if(p==NULL)  /*指针为空,说明没有找到*/
    {
		printf("\n\n\n");
        printf("\t\t The UserNo %s is not exist! \n",s); /*显示没找到信息*/
		printf("\n\n\n");
		printf("\t\t Press any key to return......");
		getch();
    }
    else
    {
        printf("\n\n"); /*换行*/
        Print(p);  /*查找成功,调用输出函数输出指针p所指记录*/
	    printf("\n\n\n");
        printf("\t\t Press any key to return......");
		getch();
    }
}

/*更新一个员工的基本资料*/
void Update(user *p)
{
    char ch;
    clrscr();
	printf("\n\n\n\n\n");
    printf("\t\t Select the Option to update:\n");
	printf("\n\n");
    printf("\t\t 1.UserNo\n");
	printf("\t\t 2.UserName\n");
	printf("\t\t 3.Wage\n");
	printf("\t\t 4.OtherWage\n");
	printf("\t\t 0.exit\n");
	gotoxy(20,15);
    while ((ch=getch())!='0')
    {

⌨️ 快捷键说明

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