图书信息管理系统c语言

 

 library.cpp文件

#include "library.h"

void InitQueue(LinkQueue *L)        //初始化队列 
{
	L->front=(QueuePtr)malloc(sizeof(QNode));
	if(L->front == NULL)
	{
		printf("\n分配内存失败!!\n");
		system("pause");
		exit(0); 
	}
	L->rear=L->front;
	L->front->next=NULL; 
}

Status InQueue(LinkQueue*L,ElemType *e)   //入队 
{
	QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
	if(p == NULL)
	{
		printf("\n分配内存失败!!\n");
		system("pause");
		exit(0); 
	}
	p->data = e;
	
//	printf("%s\t%ld\t\t%s\t\t%d-%d-%d\t%d\t%d\n",p->data->name,p->data->id,p->data->bookname,p->data->year,p->data->month,p->data->day,p->data->time,p->data->money);
//	system("pause");
	
	p->next = NULL;
	L->rear->next = p;
	L->rear = p;
	return 1; 
}

Status OutQueue(LinkQueue *L,ElemType &e)  //出队 
{
	if(L->rear==L->front)
	{
		printf("\n队列为空!!\n");
		system("pause"); 
		return 0;
	 } 
	QueuePtr adjust = L->front->next;
	e = *adjust->data;
	
//	printf("%s\t%ld\t\t%s\t\t%d-%d-%d\t%d\t%d\n",e.name,e.id,e.bookname,e.year,e.month,e.day,e.time,e.money);
//	system("pause");
	
	if(L->rear == L->front->next)
	{
		L->rear=L->front;
	 } 
	 L->front->next=adjust->next;
	 free(adjust);
	 return 1;
	 
} 

///
int main()
{
	char  command;   //定义最开始的界面(选择角色登录界面的输入指令) 
	while(1)
	{   
	    system("cls");
		character_menu();
		command=getch();
		switch(command)
		{
			case '1' : administrators_menu();break;    //跳转到管理员选择页面 
			case '2' : users_menu();break;    //跳转到用户选择页面 
			case '3' : notice_to_users();break;  //跳转到用户须知页面 
			case '0' : exit(0);                 //退出 
			default  : printf("您输入的数据非法!请您重新输入!!(按任意键返回输入)\n"); getch();
		}
		
	} 
}



//
void character_menu()      //选择角色(管理员和用户)页面 的菜单显示 
{
	printf("\t\t\t----------------------------------\n");
	printf("\t\t\t|       图书信息管理系统系统     |\n");
	printf("\t\t\t----------------------------------\n");
	printf("\t\t\t|          1.管理员登录          |\n");
	printf("\t\t\t|          2.用户入口            |\n");
	printf("\t\t\t|          3.用户须知            |\n");
	printf("\t\t\t|          0.退出系统            |\n");
	printf("\t\t\t----------------------------------\n");
	printf("请输入指令:[\t]\b\b\b");

}

void notice_to_users()      //用户须知 
{
system("cls");
printf("\n这是一个图书信息管理系统,为了帮助您更快的了解并使用它,请先仔细阅读一下事项:\n");
printf("\t\t\t|                          注意事项                            |\n");
printf("\t\t\t|                     1.请按照指示进行操作!!                   |\n");
printf("\t\t\t|   2.管理员首次使用必须先进行初始化图书信息!!                 |\n");
printf("\t\t\t|   3.普通用户借书期限为60天,每超过一天就会罚款2元!!          |\n");
printf("\t\t\t|   4.普通用户如果有建议可在反馈箱向管理员反馈!!               |\n");
printf("\t\t\t|   5.预约功能只能在某种书库存为0的情况下进行!                 |\n");
printf("\t\t\t|   6.在输入数据时请严格按照指示进行否则系统可能奔溃!          |\n");
printf("\t\t\t|   7. 耗时3天,有bug是正常的!!                                |\n");
printf("\t\t\t|   8.作者是一名新手,如果存在bug可以聯係作者:                 |\n");
printf("\t\t\t|              qq郵箱:3111297446@qq.com                       |\n");
printf("\t\t\t|                   感謝使用該系統!!                           |\n");
system("pause");
}





/
void users_menu()      //用户选择页面 
{
   while(1)
    {
	    system("cls");
        char command5;
        users_menu1();
        command5=getch(); 
        switch(command5)
           {
        	    case '1' : print_book(head);break;
        	    case '2' :  find_book(head);break;
        	    case '3' :  borrowing_book();break;
        	    case '4' :  returning_book();break;
        	    case '5' :  administrators_suggestion_and_feedback();break;
        	    case '6' :  users_announcement() ;break;
        	    case '7' :  appointment_system();break;
            	case '8' :  return;
            	default  :printf("您输入的数据非法!请您重新输入!!(按任意键返回输入)\n");getch();
	        }
    }
}

void users_menu1()
{
	printf("\n\t\t\t++++++++++++++++++++++++\n\t\t\t+  欢迎来到用户选择页面  +\n\t\t\t++++++++++++++++++++++++\n");
    printf("\n		******************菜单栏*****************\n");
	printf("\t\t*\t      1.显示所有图书信息         *\n");
	printf("\t\t*\t      2.查询图书信息             *\n");
	printf("\t\t*\t      3.借阅图书                 *\n");
	printf("\t\t*\t      4.归还图书                 *\n");
	printf("\t\t*\t      5.给管理员的反馈与建议     *\n");
	printf("\t\t*\t      6.公告栏                   *\n");
	printf("\t\t*\t      7.预约系统                 *\n");
	printf("\t\t*\t      8.返回角色选择页面         *\n");
	printf("		*****************************************\n");
	printf("\n");
	printf("\t\t请输入指令:[\t]\b\b\b");
 } 
 
 
 
 
 /
 

 void administrators_menu()    //管理员选择页面 
{   
    while(1)
	{
       system("cls");
	   char command1; 
       administrators_menu1();
       command1=getch();
       switch(command1)
       {
        	case '1' : administrators_login();break;
        	case '2' : administrators_registers();break;
        	case '3' : administrators_reback();break;
        	case '4' :return;
        	default  :printf("您输入的数据非法!请您重新输入!!(按任意键返回输入)\n");getch();
	   }
    }

} 

void administrators_menu1()       //管理员选择页面的菜单显示 
{
	printf("\n\t\t\t++++++++++++++++++++++++\n\t\t\t+  欢迎来到管理员选择页面  +\n\t\t\t++++++++++++++++++++++++\n");
    printf("\n		******************菜单栏*****************\n");
	printf("\t\t*\t      1.登录                    *\n");
	printf("\t\t*\t      2.没有账号?去注册        *\n");
	printf("\t\t*\t      3.忘记密码?去找回        *\n");
	printf("\t\t*\t      4.返回角色选择页面        *\n");
	printf("		*****************************************\n");
	printf("\n");
	printf("\t\t请输入指令:[\t]\b\b\b");
}



void administrators_registers()    //管理员账号注册页面 
{
	system("cls");
	Create_File();     //创建文件来储存管理员账号的信息 
	administrators_users a,b;
	FILE *fp;
	char temp[20];  //temp用来确认密码的 
	printf("\n欢迎来到管理员注册界面!\n");
	//Sleep(1000);            
    fp=fopen("administratorsusers.txt","r");
	printf("请输入账号:");
	scanf("%s",&a.id);
	if(fread(&b,sizeof(struct Administrators_users),1,fp)==1)
	{
		while(1)
		{
			if(strcmp(a.id,b.id))  
			{
				if(!feof(fp))
				{
					fread(&b,sizeof(struct Administrators_users),1,fp);
				}else
				  {
				     break;	
		   	   }
			}else
	     	 {
				printf("此用户名已存在!请重新注册!\n");
				Sleep(1000);
				fclose(fp);
				return;
		 	 }
	 	} 
	}

	 printf("请输入手机号码:");
	 scanf("%s",&a.phone);
	 printf("请输入密码:");
	 scanf("%s",&a.pw);
	 printf("请确认密码:");
	 scanf("%s",&temp);
	 while(1)
	 {
	 	if(!strcmp(a.pw,temp))
	 	{
	 		fp=fopen("administratorsusers.txt","a");
	 		fwrite(&a,sizeof(struct Administrators_users),1,fp);
	 		printf("账号注册成功,请登录!\n");
	 		system("pause");
	 		fclose(fp);
	 		return;
		 }else
		   {
		 	printf("两次密码不匹配!请重新输入密码:");
		 	scanf("%s",&a.pw);
		 	printf("请确认密码:");
		 	scanf("%s",&temp);
		   }
	 }
 } 
 
 void Create_File()     //创建储存管理员用户账号密码的文件 
{
	 FILE *fp;
     if ((fp = fopen("administratorsusers.txt","r"))==NULL) /*如果此文件不存在*/
     {
         if ((fp = fopen("administratorsusers.txt","w+"))==NULL)
          {
              printf("无法建立文件!\n");
              exit(0);
          }
     }  
     fclose(fp);
}

void administrators_login()     //管理员账号登录页面 
{
	system("cls");
	administrators_users a,b;
	FILE *fp; 
	if((fp=fopen("administratorsusers.txt","r"))==NULL) 
	{
		printf("\n暂无账号密码信息,请先注册!!\n");
		system("pause");
		return;
	}

	printf("欢迎来到管理员登录页面\n");
	printf("请输入账号:");
	scanf("%s",&a.id);
	printf("请输入密码:"); 
	scanf("%s",&a.pw);
	fread(&b,sizeof(struct Administrators_users),1,fp);      //注意算法:账号先检查,若不正确则结束; 
	while(1)                                          //若正确则检查密码,只检查一次 
	{
		if(strcmp(a.id,b.id)==0)
		{
			break;
		}else
		  {
			if(!feof(fp))
			{
				fread(&b,sizeof(struct Administrators_users),1,fp);
			}else
			  {
				printf("账号或者密码有误!!\n");
				fclose(fp);
				Sleep(1000);
				system("pause");
				return;
			  }
		  }
	}
	fclose(fp);
	if(strcmp(a.pw,b.pw)==0)
	{
		printf("登录成功!欢迎使用!\n");
		system("pause");
		administrators_side_operation();     //
    }else
      {
      	printf("账号或密码有误!!\n");
      	system("pause");
      	system("cls");
      	return;
	  }
}

void administrators_reback()        //管理员密码找回页面 
{
	system("cls");
	administrators_users a,b;
	FILE *fp;
	if((fp=fopen("administratorsusers.txt","r"))==NULL) 
	{
		printf("\n暂无账号密码信息,请先注册!!\n");
		system("pause");
		return;
	}
	printf("欢迎来到管理员找回密码界面!\n");
	fp=fopen("administratorsusers.txt","r");
	fread(&b,sizeof(struct Administrators_users),1,fp);
	printf("请输入账号:\n");
	scanf("%s",&a.id);
	while(1)
	{
		if(strcmp(a.id,b.id)==0)
		{
			printf("输入的账号正确!我们将发送验证码!!\n");
			Sleep(2000);
			break;
		}else
		 {
			if(!feof(fp))
			{
				fread(&b,sizeof(struct Administrators_users),1,fp); 
			}else
			  {
			  	printf("您输入的账号不存在!!即将退出!!\n");
			  	fclose(fp);
			  	Sleep(2000);
			  	system("pause");
			  	system("cls");
			  	return;
			  }
		 }
	 } 
	 char phone_tail[5];                                                 //phone_tail[5]用来储存手机尾号(4个数) 
	 strncpy(phone_tail,b.phone+7,4);                                             
	 int system_verification_code=0,manual_verification_code=0,i;       //system_verification_code代表系统发送的验证码 
	//                                                                  // manual_verification_code代表人工输入的验证码 
	srand((unsigned)time(0));                                           //srand((unsigned) seed )是随机数发生器的初始化函数(注意每个种子对应一种随机数,我们一般使用系统时间time()函数!!) 
	 for(i=0;i<10;i++)                                        
	 {
	 	system_verification_code+=( rand () % 500 );                    //rand()%500:随机产生0-499之间的数;  rand()%500+1:1-500之间;  rand()%41+80:80-120之间 
	 }
	 printf("我们已向尾号为 %s 的手机号码发送了验证码 %d ,请注意查收!\n请您输入验证码:",phone_tail,system_verification_code);
	scanf("%d",&manual_verification_code);
	for(i=3;i>=00;i--)
	{
		if(system_verification_code==manual_verification_code)
		{
			printf("验证码输入正确!!\n我们已帮您找回密码:");
			printf("%s",&b.pw);
			printf("\n按任意键返回管理员选择页面进行登录!!\n");
			getch();
			fclose(fp);
		    return;
		}else
		  {
		  	printf("\n验证码输入错误,您剩下 %d 次机会!!\n请重新输入验证码:",i);
		  	scanf("%d",&manual_verification_code);
		  	printf("\n");
		  }
	}
	printf("您已多次输入错误!!即将返回!!");
	system("pause");
	Sleep(2000);
	fclose(fp);
	return;
}


void administrators_side_operation_menu()
{
	printf("\n\t\t\t++++++++++++++++++++++++\n\t\t\t+ 欢迎来到管理员端操作页面 +\n\t\t\t++++++++++++++++++++++++\n");
    printf("\n		******************菜单栏*****************\n");
	printf("\t\t*\t      1.返回管理员选择页面      *\n");
	printf("\t\t*\t      2.初始化图书信息          *\n");
	printf("\t\t*\t      3.批量增加图书信息        *\n");
	printf("\t\t*\t      4.批量删除图书信息        *\n");
    printf("\t\t*\t      5.批量修改图书信息        *\n");
	printf("\t\t*\t      6.保存图书信息            *\n");
	printf("\t\t*\t      7.显示全部图书信息        *\n");
	printf("\t\t*\t      8.查询图书信息            *\n");
	printf("\t\t*\t      9.备份图书信息            *\n");
	printf("\t\t*\t      a.排序功能     	       *\n"); 
	printf("\t\t*\t      b.查看借阅人信息          *\n");
	printf("\t\t*\t      c.管理员端建议与反馈      *\n");
	printf("\t\t*\t      d.管理员端公告            *\n");
	printf("		*****************************************\n");
	printf("\n");
	printf("\t\t请输入指令:[\t]\b\b\b");
}

void administrators_side_operation()    //管理员端操作页面 
{
//	bookinformation *head;
//	head=NULL; 
	system("cls");
	char command2;   
	administrators_side_operation_menu();
	command2=getch();
	getch(); 
    while(command2)
	{
		if(command2=='1')
		{
			return;
		}else if(command2=='2')
		{
			if(head == NULL)
			{
					head =creat();
			}else
			{
				printf("\n系统先前已经初始化图书信息(按任意键返回输入)\n");getch(); 
			}
		}else if(command2=='3')
		{
			add_book( head );
		}else if(command2=='4')
		{
			head=del_book( head );
		}else if(command2=='5')
		{
			change_book( head );
		}else if(command2=='6')
		{
			reserve_book1( head );
			reserve_book( head );
		}else if(command2=='7')
		{
			print_book(head);
		}else if(command2=='8')
		{
			find_book(head);
		}else if(command2=='9')
		{
			backup_book(head);
		}else if(command2=='a')
		{
			head=sort( head );
		}else if(command2=='b')
		{
			print_borrowers(head1); 
		}else if(command2=='c')
		{
			users_suggestion_and_feedback();
		}else if(command2=='d') 
		{
			administrators_announcement();
		}else
		{
			printf("\n您输入的数据非法!请您重新输入!!(按任意键返回输入)\n");getch(); 
		}
		system("cls");
		administrators_side_operation_menu();
		command2=getch();
		
	}
	
}

bookinformation *creat()            //指向bookinformation结构体类型指针函数用于创建链表并初始化数据
{
	system("cls");
	printf("欢迎来到初始化图书信息页面!!\n");
	bookinformation *head1;
	bookinformation *p1,*p2;
	head1=NULL;
	int number=1;     
	p1=p2=(struct _bookinformation *)malloc(LEN);
	printf("请输入图书信息\n(编号、书名、作者、出版社、类别、出版时间、价格、库存)(当输入的编号为 0 时则结束,后面输入的数据无效)\n");
	scanf("%ld%s%s%s%s%ld%f%ld",&p1->id,&p1->name,&p1->author,&p1->publisher,&p1->type,&p1->pubtime,&p1->price,&p1->num);
	p1->bnum=0;
	
	p1->L.front=NULL;      //
	p1->L.rear=p1->L.front; 
	
	while(p1->id !=0)
	{
		if(number==1)
		{
			head1=p1;
			number++;
		}else
		  {
		  	p2->next=p1;
		  }
		  p2=p1;
		  p1=(struct _bookinformation *)malloc(LEN);
		  printf("请输入图书信息\n(编号、书名、作者、出版社、类别、出版时间、价格、库存)(当输入的编号为 0 时则结束,后面输入的数据无效)\n");
	      scanf("%ld%s%s%s%s%ld%f%ld",&p1->id,&p1->name,&p1->author,&p1->publisher,&p1->type,&p1->pubtime,&p1->price,&p1->num);
	      p1->bnum=0;
	      
	   	  p1->L.front=NULL;      //
		  p1->L.rear=p1->L.front; 
	      
	} 
	p2->next=NULL;
	printf("初始化图书信息已完成!!\n");
	system("pause"); 
	Sleep(1000);
	return(head1); 
}

void add_book(bookinformation *head)           //批量增加图书信息 
{
	system("cls");
	if(head==NULL)
	{
		printf("您未进行初始化图书信息!!\n请您按任意键返回管理员端操作页面!!\n");
		system("pause"); 
		return;
	}
	printf("欢迎来到增加图书信息页面!!\n");
	bookinformation *p1,*p2;
	p2=head;
	while(1)
	{
		if(p2->next==NULL)
		{
			p1=(struct _bookinformation *)malloc(LEN);
			printf("请输入图书信息\n(编号、书名、作者、出版社、类别、出版时间、价格、库存)(当输入的编号为 0 时则结束,后面输入的数据无效)\n");
			scanf("%ld%s%s%s%s%ld%f%ld",&p1->id,&p1->name,&p1->author,&p1->publisher,&p1->type,&p1->pubtime,&p1->price,&p1->num);
			p1->bnum=0;
			
			p1->L.front=NULL;      //
			p1->L.rear=p1->L.front; 
			
	        while(p1->id!=0)
	        {
	        	p2->next=p1;
	        	p2=p1;
	        	p1=(struct _bookinformation *)malloc(LEN);
				printf("请输入图书信息\n(编号、书名、作者、出版社、类别、出版时间、价格、库存)(当输入的编号为 0 时则结束,后面输入的数据无效)\n");
				scanf("%ld%s%s%s%s%ld%f%ld",&p1->id,&p1->name,&p1->author,&p1->publisher,&p1->type,&p1->pubtime,&p1->price,&p1->num);
				p1->bnum=0;
				
				p1->L.front=NULL;      //
				p1->L.rear=p1->L.front; 
				
			}
	        p2->next=NULL;
	        break;
		}
		p2=p2->next;
	}
	printf("增加图书信息成功!!\n即将返回管理员端操作页面!!\n");
	system("pause");
	Sleep(2000);
	return;
}



bookinformation *del_book(bookinformation *head)     //批量删除图书信息 
{
	system("cls");
	if(head==NULL)
	{
		printf("您未进行初始化图书信息!!\n请您按任意键返回管理员端操作页面!!\n");
		system("pause"); 
		return head;
	}
	char isAgain; 
	bookinformation *p,*p1;
	long id;
	printf("欢迎来到删除图书信息页面!!\n请输入要删除图书的编号:");
	scanf("%ld",&id);
again://注意!!

    p=head;
	while(1)
	{

		if(head->id==id)
		{
			head=head->next;
			free(p);     //释放动态内存 
			if(head == NULL)    
			{
				break;
			} 
			printf("继续删除图书信息按 1 ,返回管理员端操作页面按 2 \n");
			isAgain=getch();
			if(isAgain=='1')
			{
				printf("请输入要删除图书的编号:");
				scanf("%ld",&id);
				goto again;                                    //注意!!! 
			}
			else if(isAgain=='2')
			{
				break;
		    }
			else
			{
				printf("输入错误!!\n");
				Sleep(2000);
				break;
			}
		}else
		{
			p1=p;
			p1=p->next;   //p1指向下一动态内存存储区 
			
			if(p1==NULL)
			{
				printf("您输入的编号有误!!!\n即将返回管理员端操作页面!!\n");
		   		system("pause");
		   		Sleep(2000);
		   		return head;
			}
			 	
			if(p1->id==id)
			{
				p->next=p1->next;   //两个动态存储区连接处跳开中间的p1 
				p=p1;
				free(p1);
				printf("继续删除图书信息按 1 ,返回管理员端操作页面按 2 \n");
				isAgain=getch();
				if(isAgain=='1')
				{
					printf("请输入要删除图书的编号:");
					scanf("%ld",&id);
					goto again;
				} 
				else if(isAgain=='2')
				{
					break;
				}
				else
			    {
				printf("输入错误!!\n");
				Sleep(2000);
				break;
			    }
			}
			
			
			p=p->next;  
		   if(p->next==NULL)
		   {
		   	printf("您输入的编号有误!!!\n即将返回管理员端操作页面!!\n");
		   	system("pause");
		   	Sleep(2000);
		   	return head;
		   }
		}
	}
	
	
	printf("成功删除指定图书信息!!\n即将返回管理员端操作页面!!\n");
	Sleep(2000);
	system("pause");
	return head; 
 } 
 
void change_book(bookinformation *head)             //批量修改图书信息 
 {
 	system("cls");
 	if(head==NULL)
	{
		printf("您未进行初始化图书信息!!\n请您按任意键返回管理员端操作页面!!\n");
		system("pause"); 
		return;
	}
	printf("欢迎您来到修改图书信息页面!!\n");
	bookinformation *p;
	long id,pubtime,num;
	char publisher[50];
	char name[30];
	char author[30];
	char type[30];
	char isAgain; 
	float price;
	printf("请您输入要修改图书的编号:");
	scanf("%ld",&id);
	
again:                        //注意!!!	
	
	p=head;
	while(1)
	{
		if(p->id==id)
		{
			break;
		}
		p=p->next;
		if(p==NULL)
	    {
		    printf("未找到该图书的信息!!!\n即将返回管理员端操作页面!!\n");
		    system("pause");
		    return;
	    }
	}
	
	printf("请输入图书信息\n(编号、书名、作者、出版社、类别、出版时间、价格、库存)\n");
	scanf("%ld%s%s%s%s%ld%f%ld",&id,&name,&author,&publisher,&type,&pubtime,&price,&num);
    p->id=id;
    strcpy(p->type,type);
    strcpy(p->name,name);
    strcpy(p->author,author);
    strcpy(p->publisher,publisher);
    p->price=price;
    p->num=num;
    printf("继续修改图书信息按 1 ,返回管理员端操作页面按 2 \n");
	isAgain=getch();
	if(isAgain=='1')
	{
		printf("请输入要修改图书的编号:");
		scanf("%ld",&id);
		goto again;                                    //注意!!! 
	}
	else if(isAgain=='2')
	{
		return;
	}
	else
	{
		printf("输入错误!!\n");
		system("pause");
		Sleep(2000);
		return;
	}
 }
 
 void reserve_book(bookinformation *head)       //保存图书信息到 book1.txt(二进制文件) 
{
	system("cls");
	Create_File2();  //创建book1.txt 
	FILE *fp;
	bookinformation *p ;
	p=head;
	fp=fopen("book1.txt","wb");
	while(p!=NULL)
	{
		fwrite(p,sizeof(struct _bookinformation),1,fp);
		p=p->next;
	}
	fclose(fp);
	printf("图书信息已保存到文件book1.txt!!");
	system("pause");
	Sleep(2000);
	return;
	 
} 
void reserve_book1(bookinformation *head)        //保存图书信息到book.txt(文本文件) 
{
	system("cls");
	Create_File1();       //创建book.txt 
	FILE *fp;
	bookinformation *p ;
	p=head;
	fp=fopen("book.txt","w");
	while(p!=NULL)
	{
	    fprintf(fp,"%ld %s %s %s %s %ld %.1f %ld %ld ",p->id,p->name,p->author,p->publisher,p->type,p->pubtime,p->price,p->num,p->bnum);
		p=p->next;
	}
	fclose(fp);
	printf("图书信息已保存到文件book.txt!!");
	system("pause");
	Sleep(2000);
	return;
}

void Create_File1()             //创建储存图书信息的文件 book.txt
{
	system("cls"); 
	FILE *fp;
    if ((fp = fopen("book.txt","r"))==NULL) /*如果此文件不存在*/
    {
        if ((fp = fopen("book.txt","w+"))==NULL)
        {
            printf("无法建立文件!\n");
            Sleep(1000);
            exit(0);
        }
    }  
    fclose(fp);
}

void Create_File2()             //创建储存图书信息的文件 book1.txt
{
	FILE *fp;
    if ((fp = fopen("book1.txt","rb"))==NULL) /*如果此文件不存在*/
    {
        if ((fp = fopen("book1.txt","wb+"))==NULL)
        {
            printf("无法建立文件!\n");
            Sleep(1000);
            exit(0);
        }
    }  
    fclose(fp);
}


void print_book(bookinformation *head)        //显示已保存全部图书信息 
{
    system("cls");
 	//FILE *fp;
 	if(head==NULL)      //判断有无初始化 
	{
		printf("未进行初始化图书信息!!\n请按任意键返回!!\n");
		system("pause"); 
		return;
	}
	bookinformation *p;
	p=head;
	int count =1;
	printf("------------------------------------------------图书信息--------------------------------------------------------\n");
	printf("序号\t编号\t书名\t作者\t出版社\t类别\t出版时间\t价格\t库存\t已借出\n");
	while(p!=NULL)
	{
		printf("%d\t%ld\t%s\t%s\t%s\t%s\t%ld\t%.1f\t%ld\t%ld\n",count,p->id,p->name,p->author,p->publisher,p->type,p->pubtime,p->price,p->num,p->bnum);
		p=p->next; 
		count++;
	 } 
	printf("\n以上为全部图书的信息\n");
	printf("\n");
	system("pause");
	return;
	/*
	if ((fp = fopen("book1.txt","rb"))==NULL) //如果此文件不存在
    {
        printf("您未保存文件!!!\n即将返回管理员端操作页面!!!\n");
        system("pause");
		return; 
    }
 	printf("------------------------------------------------图书信息--------------------------------------------------------\n");
 	printf("编号\t书名\t作者\t出版社\t类别\t出版时间\t价格\t库存\n");
    fp=fopen("book1.txt","rb"); 
    
    bookinformation *p;
    
    while(1)
    {
        if(fread(p,sizeof(struct _bookinformation),1,fp)==1) //这一行不知道为什么运行失误?从文件读取信息并打印 
        {
            printf("%ld\t%s\t%s\t%s\t%s\t%ld\t%.1f\t%ld\n",p->id,p->name,p->author,p->publisher,p->type,p->pubtime,p->price,p->num);
		
		}
		else
		{
			printf("\n以上为已保存的全部图书的信息\n");
			fclose(fp);
			system("pause");
			return;
		}
	} 
	*/
}

//
void find_book(bookinformation *head)         //查询图书信息页面 
{
	system("cls");
	if(head==NULL)      //判断有无初始化 
	{
		printf("未进行初始化图书信息!!\n请按任意键返回!!\n");
		system("pause"); 
		return;
	}
	printf("欢迎来到查询图书信息页面!!!\n提示:\n1.输入'1'按编号查询;\n2.输入'2'按书名查询;\n3.输入'3'按作者查询;\n4.输入'4'按出版社查询;\n5.输入'5'按价格范围查询;\n6.输入'6'返回管理员端操作页面;\n");
	char command3;
	printf("请输入指令:"); 
	command3=getch();
	while(1)
	{
		if(command3=='1')
		{
			find_book_id(head);
		}else if(command3=='2')
		{
			find_book_name(head); 
		}else if(command3=='3')
		{
		   find_book_author(head);
		}else if(command3=='4')
		{
			find_book_publisher(head);
		}else if(command3=='5')
		{
			find_book_price(head); 
		}else if(command3=='6')
		{
			printf("\n即将返回!!");
			Sleep(2000);
			return;
		}else
		{
		  printf("\n输入有误!!!\n");
		  Sleep(2000);
		}
		system("cls");
		printf("欢迎来到查询图书信息页面!!!\n提示:\n1.输入'1'按编号查询;\n2.输入'2'按书名查询;\n3.输入'3'按作者查询;\n4.输入'4'按出版社查询;\n5.输入'5'按价格范围查询;\n6.输入'6'返回管理员端操作页面;\n");
		printf("请输入指令:"); 
		command3=getch();
	}
	 
	
 } 

 void find_book_id(bookinformation *head)         //通过编号查询图书信息 
 {
 	system("cls");
 	bookinformation *p;
 	p=head;
 	long id;
 	printf("请输入图书的编号:");
 	scanf("%ld",&id);
 	while(p!=NULL)                        //采用遍历的方法 
 	{
 		if(p->id==id)
 		{
 			printf("------------------------------------------------图书信息--------------------------------------------------------\n");
 	        printf("编号\t书名\t作者\t出版社\t类别\t出版时间\t价格\t库存\t已借出\n");
 	        printf("%ld\t%s\t%s\t%s\t%s\t%ld\t%.1f\t%ld\t%ld\n",p->id,p->name,p->author,p->publisher,p->type,p->pubtime,p->price,p->num,p->bnum);
 	        printf("\n以上为该图书信息!!按任意键返回!!\n");
 	        system("pause");
 	        break;
		}else if(p->next==NULL)
		{
			printf("未找到该图书!!请按任意键返回!");
			system("pause");
			break;
		}
		p=p->next;
		
	}
 }
 
void find_book_name(bookinformation *head)       //通过书名查询图书信息 
 {
 	system("cls");
 	bookinformation *p;
 	p=head;
 	char name[30];
 	printf("请输入图书书名:");
 	scanf("%s",name);
 	while(p!=NULL)                        //采用遍历的方法 
 	{
 		if(strcmp(name,p->name)==0)
 		{
			printf("------------------------------------------------图书信息--------------------------------------------------------\n");
 	        printf("编号\t书名\t作者\t出版社\t类别\t出版时间\t价格\t库存\t已借出\n");
 	        printf("%ld\t%s\t%s\t%s\t%s\t%ld\t%.1f\t%ld\t%ld\n",p->id,p->name,p->author,p->publisher,p->type,p->pubtime,p->price,p->num,p->bnum);
 	        printf("\n以上为该图书信息!!按任意键返回!!\n");
 	        system("pause");
 	        break;
		}else if(p->next==NULL)
		{
			printf("未找到该图书!!请按任意键返回!");
			system("pause");
			break;
		}
		p=p->next;	
	}
 }
 
 void find_book_author(bookinformation *head)       //通过作者查询图书信息 
 {
 	system("cls");
 	bookinformation *p;
 	p=head;
 	char author[30];
 	printf("请输入作者名:");
 	scanf("%s",author);
 	while(p!=NULL)                        //采用遍历的方法 
 	{
 		if(strcmp(author,p->author)==0)
 		{
			printf("------------------------------------------------图书信息--------------------------------------------------------\n");
 	        printf("编号\t书名\t作者\t出版社\t类别\t出版时间\t价格\t库存\t已借出\n");
 	        printf("%ld\t%s\t%s\t%s\t%s\t%ld\t%.1f\t%ld\t%ld\n",p->id,p->name,p->author,p->publisher,p->type,p->pubtime,p->price,p->num,p->bnum);
 	        printf("\n以上为该图书信息!!按任意键返回!!\n");
 	        system("pause");
 	        break;
		}else if(p->next==NULL)
		{
			printf("未找到该图书!!请按任意键返回!");
			system("pause");
			break;
		}
		p=p->next;	
	}
 }
 
void find_book_publisher(bookinformation *head)       //通过出版社查询图书信息 
{
 	system("cls");
 	bookinformation *p;
 	p=head;
 	char publisher[50];
 	printf("请输入出版社:");
 	scanf("%s",publisher);
 	while(p!=NULL)                        //采用遍历的方法 
 	{
 		if(strcmp(publisher,p->publisher)==0)
 		{
			printf("------------------------------------------------图书信息--------------------------------------------------------\n");
 	        printf("编号\t书名\t作者\t出版社\t类别\t出版时间\t价格\t库存\t已借出\n");
 	        printf("%ld\t%s\t%s\t%s\t%s\t%ld\t%.1f\t%ld\t%ld\n",p->id,p->name,p->author,p->publisher,p->type,p->pubtime,p->price,p->num,p->bnum);
 	        printf("\n以上为该图书信息!!按任意键返回!!\n");
 	        system("pause");
 	        break;
		}else if(p->next==NULL)
		{
			printf("未找到该图书!!请按任意键返回!");
			system("pause");
			break;
		}
		p=p->next;	
	}
}

void find_book_price(bookinformation *head)    //通过价格的范围查询图书信息 
 {
 	system("cls");
 	bookinformation *p;
 	p=head;
 	int n=0;
 	float priceMax,priceMin;
 	printf("请输入价格最大值:");
	scanf("%f",&priceMax);
	printf("请输入价格最小值:");
	scanf("%f",&priceMin);
	system("cls");
	printf("------------------------------------------------图书信息--------------------------------------------------------\n");
	printf("编号\t书名\t作者\t出版社\t类别\t出版时间\t价格\t库存\t已借出\n");
 	while(p!=NULL)                                    //同理遍历 
	 {
	 	if((p->price)<=priceMax&&(p->price)>=priceMin)
		 {
		 	n=1;
		 	printf("%ld\t%s\t%s\t%s\t%s\t%ld\t%.1f\t%ld\t%ld\n",p->id,p->name,p->author,p->publisher,p->type,p->pubtime,p->price,p->num,p->bnum);
	     }
		 p=p->next;
	  } 
	  if(n==0)
	  {
	  	printf("未找到符合条件的图书!!请按任意键返回!");
		system("pause");
		return;
	  }else if(n==1)
	  {
	  		printf("\n以上为该图书信息!!按任意键返回!!\n");
 	        system("pause");
 	        return;
	  }
 }
 
 
 //
 
 
 void backup_book(bookinformation *head)        //备份图书信息(将book.txt备份到backup.txt) 
{
	system("cls");
	if(head==NULL)      //判断有无初始化 
	{
		printf("您未进行初始化图书信息!!\n请您按任意键返回管理员端操作页面!!\n");
		system("pause"); 
		return;
	}
	FILE *in,*out;
	char ch;
	if((in=fopen("book.txt","r"))==NULL)
	{
		printf("打开book.txt文件失败!!!");
		Sleep(2000);
		fclose(in);
		fclose(out);
		exit(0);
	}
	if((out=fopen("backup.txt","w"))==NULL)
	{
		printf("打开备份文件失败!!!");
		Sleep(2000);
		fclose(in);
		fclose(out);
		exit(0);
	}
	ch=fgetc(in);
	while(!feof(in))
	{
		fputc(ch,out);
		ch=fgetc(in);
	}
	fclose(in);
	fclose(out);
	printf("成功备份!!!\n");
	system("pause");
	Sleep(2000);
	return;
}


/

bookinformation *sort(bookinformation *head)                       //排序选择页面 
{
	system("cls");
	if(head==NULL)      //判断有无初始化 
	{
		printf("您未进行初始化图书信息!!\n请您按任意键返回管理员端操作页面!!\n");
		system("pause"); 
		return head;
	}
	int number;
	number=number_of_book(head);
	printf("欢迎来到排序功能页面!!\n提示:\n1.'1'代表按编号排序;\n2.'2'代表按价格排序;\n3.'3'代表按库存排序;\n4.'4'代表按出版时间排序;\n5.'5'代表返回管理员端操作系统;\n");
	printf("请输入指令:");
	char command4;
	command4=getch();
	while(1)
	{
		if(command4=='1')
		{
			head=sort_book(number , head , compare_id);
			printf("\n按编号排序\n");
			print(head);
			system("pause");
		}else if(command4=='2')
		{
		  head=sort_book(number , head , compare_price);
		  printf("\n按价格排序\n");
		  print(head);
		  system("pause"); 
		  
		}else if(command4=='3')
		{
		   head=sort_book(number , head , compare_num);
		   printf("\n按库存排序\n");
		   print(head);
		   system("pause");
		}else if(command4=='4')
		{
		   head=sort_book(number , head , compare_pubtime);
		   printf("\n按出版时间排序\n");
		   print(head);
		   system("pause"); 
		}else if(command4=='5')
		{
			printf("\n即将返回管理员端操作页面!!");
			Sleep(2000);
			return head;
		}else
		{
		  printf("\n输入有误!!!\n");
		  Sleep(2000);
		}
		system("cls");
		printf("欢迎来到排序功能页面!!\n提示:\n1.'1'代表按编号排序;\n2.'2'代表按价格排序;\n3.'3'代表按库存排序;\n4.'4'代表按出版时间排序;\n5.'5'代表返回管理员端操作系统;\n");
		printf("请输入指令:"); 
		command4=getch();
    }
}

int number_of_book(bookinformation *head)         //计算图书数量 
{
	bookinformation *p;
	p=head;
	int n=1;
	while(p->next!=NULL)
	{
		n++; 
		p=p->next; 
	}
	return n;
}

void print(bookinformation *head)    //显示排序后的图书信息 
{
	bookinformation *p;
	p=head;
	int count =1;
	printf("------------------------------------------------图书信息--------------------------------------------------------\n");
	printf("序号\t编号\t书名\t作者\t出版社\t类别\t出版时间\t价格\t库存\t已借出\n");
	while(p!=NULL)
	{
		printf("%d\t%ld\t%s\t%s\t%s\t%s\t%ld\t%.1f\t%ld\t%ld\n",count,p->id,p->name,p->author,p->publisher,p->type,p->pubtime,p->price,p->num,p->bnum);
		p=p->next; 
		count++;
	 } 
	 printf("\n");
}

bookinformation *sort_book(int number , bookinformation *head , int(*compare)(bookinformation *p))   // 链表冒泡排序(最难的!!!) 
{
	system("cls");
	int t;
	printf("提示;\n1.输入'0'代表小->大;\n2.输入'2'代表大->小;\n");
	scanf("%d",&t);
	
	int i,j;
	bookinformation *p;
	p=head;
	if(t==0||t==2)
	{
	for(i=0;i<number-1;i++)
	{
		p=head;
		for(j=0;j<number-1-i;j++)
		{
			if(compare(p)>0 && t==0)
			{
			    swap(p); 
			    
			}else if(compare(p)<0 && t==2 )
			{
				 swap(p); 
			}
			p=p->next; 
		}
	}
    }else
    {
    	printf("输入有误!!!\n仍按原序列排序!!");
    	system("pause");
    	return head;
	}
	return head;
}


void swap(bookinformation *p)      //交换p和p->next的内容 
{
	bookinformation *temp;
	temp=(struct _bookinformation *)malloc(LEN);
	      	//把p->next的内容放到temp 
				temp->id=p->next->id;
				temp->pubtime=p->next->pubtime;
				temp->num=p->next->num;
				temp->price=p->next->price;
				strcpy(temp->name,p->next->name);
				strcpy(temp->publisher,p->next->publisher);
				strcpy(temp->author,p->next->author);
				strcpy(temp->type,p->next->type);
				//把p的内容放到p->next
				p->next->id=p->id;
				p->next->pubtime=p->pubtime;
				p->next->num=p->num;
				p->next->price=p->price;
				strcpy(p->next->publisher,p->publisher);
				strcpy(p->next->name,p->name);
				strcpy(p->next->author,p->author);
				strcpy(temp->type,p->next->type);
				//把temp的内容放到p
				p->id=temp->id;
				p->pubtime=temp->pubtime;
				p->num=temp->num;
				p->price=temp->price;
				strcpy(p->publisher,temp->publisher);
				strcpy(p->name,temp->name);
				strcpy(p->author,temp->author);
				strcpy(temp->type,p->next->type); 
}


int compare_id(bookinformation *p)       //比较p和p->next的编号大小 
{
	return (p->id - p->next->id);
}

int compare_pubtime(bookinformation *p)       //比较p和p->next的出版时间大小 
{
	return (p->pubtime - p->next->pubtime);
}

int compare_price(bookinformation *p)       //比较p和p->next的价格大小 
{
	return (p->price - p->next->price);
}

int compare_num(bookinformation *p)       //比较p和p->next的库存大小 
{
	return (p->num - p->next->num);
}



void print_borrowers(borrowers *head1)        //显示已全部借阅人信息 
{
    system("cls");
 	//FILE *fp;
 	if(head1==NULL)      //判断有无初始化 
	{
		printf("暂无借阅信息!!\n请您按任意键返回管理员端操作页面!!\n");
		system("pause"); 
		return;
	}
	borrowers *p;
	p=head1;
	int count =1;
	printf("------------------------------------------------借阅人信息--------------------------------------------------------\n");
	printf("序号\t姓名\t身份证\t\t借阅书籍\t年 -月-日\t借书天数\t罚款余额\n");
	while(p!=NULL)
	{
		printf("%d\t%s\t%ld\t\t%s\t\t%d-%d-%d\t%d\t%d\n",count,p->name,p->id,p->bookname,p->year,p->month,p->day,p->time,p->money);
		p=p->next; 
		count++;
	 } 
	printf("\n以上为全部借阅人的信息\n");
	printf("\n");
	system("pause");
	return;
}


void borrowing_book()       //借阅书籍 
{
///
	time_t timep;
    struct tm *p4;
    time (&timep);
    p4=gmtime(&timep);
    int time;
    int money; 

	system("cls");
	if(head == NULL)
	{
		printf("\n暂无图书可借!!请联系管理员!!\n");
		Sleep(1000);
		system("pause");
		return ; 
	}
	if(head1 == NULL)
	{
		head1 = creat1();
		return;
	}else
	{
		system("cls");
		printf("欢迎来到借阅图书页面!!\n");
		Sleep(1000);
		borrowers *p,*p1,*p3;
		bookinformation *p2;
		p2=head;
		p=head1;
		p3=head1;
		while(p->next!=NULL)
		{
			p=p->next;
		}
		p1=(struct _borrowers*)malloc(LEN1);
		printf("请输入借阅信息信息\n(姓名、身份证、书名、年、月、日)\n");
		scanf("%s%ld%s%d%d%d",&p1->name,&p1->id,&p1->bookname,&p1->year,&p1->month,&p1->day);
		
		if((p1->month==(1+p4->tm_mon))&&((p1->day)>(p4->tm_mday)))
		{
			printf("\n非常抱歉!!您输入错误!!!\n");
			system("pause");
			Sleep(1000);
			return ;
		}
		
		while(p3!=NULL)
		{
			if((p1->id==p3->id)&&(strcmp(p1->name,p3->name)!=0))
			{
				printf("\n非常抱歉!!您输入的信息是错误的!!!\n");
				system("pause");
				Sleep(1000);
				return ;
			}
			p3=p3->next; 
		}
		
		if((p1->year>0&&p1->year<=2023)&&(p1->month>=1&&p1->month<=12)&&(p1->day>=0&&p1->day<=30))
		{
			p1->time = ((1900+p4->tm_year)*365+(1+p4->tm_mon)*31+p4->tm_mday)-(p1->year*365+p1->month*31+p1->day);
			if(p1->time>60)
			{
				p1->money=(p1->time-60)*2;
			}else
			{
				p1->money=0;
			}
			
			while(p2!=NULL)
			{
				if(strcmp(p2->name,p1->bookname)==0)
				{
					if(p2->num>0)
					{
						p2->num--;
						p2->bnum++;
						p1->next=NULL; 
						p->next=p1;
						printf("\n借阅成功!!\n");
						system("pause"); 
						Sleep(1000);
						return;
					}else if(p2->num==0)
					{
						printf("\n非常抱歉!!您想借阅的书籍库存为0!!\n");
						system("pause"); 
						Sleep(1000); 
						return ;
					}
				}
				p2=p2->next;
			}
		}
		
		printf("\n非常抱歉!!您输入的图书名是错误的!!!\n");
		system("pause");
		Sleep(1000);
		return ;
		

	}
} 


borrowers *creat1()            //指向borrowers结构体类型指针函数用于创建链表数据 
{
	///
	time_t timep;
    struct tm *p3;
    time (&timep);
    p3=gmtime(&timep);
    int time;
    int money; 
	
	system("cls");
	printf("欢迎来到借阅图书页面!!\n");
	borrowers *p1;
	bookinformation *p2;
	p2=head;
	p1=(struct _borrowers*)malloc(LEN1);
	printf("请输入借阅信息信息\n(姓名、身份证、书名、年、月、日)\n");
	scanf("%s%ld%s%d%d%d",&p1->name,&p1->id,&p1->bookname,&p1->year,&p1->month,&p1->day);

	if((p1->month==(1+p3->tm_mon))&&((p1->day)>(p3->tm_mday)))
	{
		printf("\n非常抱歉!!您输入错误!!!\n");
		system("pause");
		Sleep(1000);
		return NULL;
	}
	if((p1->year>0&&p1->year<=2023)&&(p1->month>=1&&p1->month<=(1+p3->tm_mon))&&(p1->day>=1&&p1->day<=30))
	{
		p1->time = ((1900+p3->tm_year)*365+(1+p3->tm_mon)*31+p3->tm_mday)-(p1->year*365+p1->month*31+p1->day);
		if(p1->time>60)
		{
			p1->money=(p1->time-60)*2;
		}else
		{
			p1->money=0;
		}
		while(p2!=NULL)
		{
			if(strcmp(p2->name,p1->bookname)==0)
			{
				if(p2->num>0)
				{
					p2->num--;
					p2->bnum++;
					p1->next=NULL; 
					printf("\n借阅成功!!\n");
					system("pause"); 
					Sleep(1000);
					return(p1);
				}else if(p2->num==0)
				{
					printf("\n非常抱歉!!您想借阅的书籍库存为0!!\n");
					system("pause"); 
					Sleep(1000); 
					return NULL;
				}
			}
			p2=p2->next;
		}
	}
	
	printf("\n非常抱歉!!您输入错误!!!\n");
	system("pause");
	Sleep(1000);
	return NULL;
	



}

void returning_book()           //归还图书      ///
{
	system("cls");
	printf("欢迎来到归还图书页面!!\n");
	if(head1==NULL)      //判断有无借阅信息 
	{
		printf("暂无借阅信息!!\n请您按任意键返回!!\n");
		system("pause"); 
		return;
	}
	char name[30];
	char bookname[30]; 
	int id;
	printf("\n请输入您的姓名、图书名、身份证!!\n");
	scanf("%s%s%ld",name,bookname,&id);
	borrowers *p1,*p;
	borrowers *t; 
	bookinformation *p2;
	p2=head;
	p1=head1;
	p=p1;
	int time;
	int money; 
	int tag=0;           //标志 
	ElemType *e;
	e=(borrowers*)malloc(sizeof(borrowers));       //??
	while(p1!=NULL)
	{
	
		if((strcmp(p1->bookname,bookname)==0)&&(strcmp(p1->name,name)==0)&&(id==p1->id))
		{
			time=p1->time;
			money=p1->money;
			while(p2!=NULL)
			{
				if(strcmp(p2->name,p1->bookname)==0)
				{
				
						p2->num++;
						p2->bnum--; 
						if(p2->L.front!=NULL)  //预约系统检测 
						{
							if((p2->num==1)&&(p2->L.front->next!=NULL))
							{
								p2->num--;
								p2->bnum++;
								tag=1;
							///
							}
						} 
						break;		
				}
				p2=p2->next;
			}
			if(p1==head1)
			{
				head1=p1->next;
				free(p1);
			}else if(p1->next==NULL)
			{
				free(p1);
				p->next=NULL; 
			}else
			{
				p->next=p1->next;
				free(p1);
			}
			if(money==0)
			{
				printf("\n您在60天内成功归还图书!!\n");
			}else
			{
				time = time-60;
				printf("\n您已逾期%d天,我们已扣除您%d元!!!\n",time,money);
			}
			printf("\n归还成功!!!\n");
			//
			if(tag==1)         //检测到该书有库存并且有人排队 
			{
				OutQueue(&p2->L,*e);  //出队
				
			//	printf("%s\t%ld\t\t%s\t\t%d-%d-%d\t%d\t%d\n",e->name,e->id,e->bookname,e->year,e->month,e->day,e->time,e->money);//
				
				t=head1;
				if(t==NULL)
				{
					head1=e;
					head1->next=NULL; 
				}else
				{
					while(t->next!=NULL)
					{
						t=t->next;
					}
					t->next=e;
					e->next=NULL;
				}
				printf("\n预约系统消息: %s 成功预约 %s \n",e->name,e->bookname);
			}
			//
			system("pause");
			Sleep(1000);
			return;
		}
		p=p1;
		p1=p1->next; 
	}
	printf("\n您输入的信息有误!!!\n");
	system("pause");
	Sleep(1000);
	return;
}


void administrators_suggestion_and_feedback()               //用户端建议与反馈箱
{
	system("cls");
	printf("欢迎来到用户端建议与反馈箱!!!\n");
	FILE *fp;
	Create_File3();        //建立admSgtFb.txt
	fp=fopen("admSgtFb.txt","w");
	printf("请输入您的建议与反馈:(提示:为避免系统错误最多输入100个字,包括标点符号!!)\n");
	char str[200];
	gets(str);
	fputs(str,fp);
	fclose(fp);
	putchar(10);
	system("pause");
	return;
	 
}

void Create_File3()     //建立admSgtFb.txt 
{ 
	FILE *fp;
    if ((fp = fopen("admSgtFb.txt","r"))==NULL) /*如果此文件不存在*/
    {
        if ((fp = fopen("admSgtFb.txt","w+"))==NULL)
        {
            printf("无法建立文件!\n");
            Sleep(1000);
            exit(0);
        }
    }  
    fclose(fp);
}

void users_suggestion_and_feedback()     //管理员端建议与反馈箱 
{
	system("cls");
	FILE *fp;
	char ch;
	printf("欢迎来到管理员端建议与反馈箱!!\n");
	Create_File3();            //建立admSgtFb.txt 
	fp=fopen("admSgtFb.txt","r");
	ch=getc(fp);
	while(!feof(fp))
	{
		putchar(ch);
		ch=getc(fp);
	}
	putchar('\n');
	fclose(fp);
	printf("按任意键返回管理员端操作系统!!\n");
	system("pause");
	return;
}

void administrators_announcement()               //管理员端公告板 
{
	system("cls");
	printf("欢迎来到管理员端公告板!!!\n");
	FILE *fp;
	Create_File4();        //建立announcement.txt
	fp=fopen("announcement.txt","w");
	printf("请输入公告:(提示:为避免系统错误最多输入100个字,包括标点符号!!)\n");
	char str[200];
	gets(str);
	fputs(str,fp);
	fclose(fp);
	putchar(10);
	system("pause");
	return;
	 
}

void Create_File4()     //建立announcement.txt 
{ 
	FILE *fp;
    if ((fp = fopen("announcement.txt","r"))==NULL) /*如果此文件不存在*/
    {
        if ((fp = fopen("announcement.txt","w+"))==NULL)
        {
            printf("无法建立文件!\n");
            Sleep(1000);
            exit(0);
        }
    }  
    fclose(fp);
}




void users_announcement()     //用户端公告板 
{
	system("cls");
	FILE *fp;
	char ch;
	printf("欢迎来到公告板!!\n");
	Create_File4();            //建立announcement.txt 
	fp=fopen("announcement.txt","r");
	ch=getc(fp);
	while(!feof(fp))
	{
		putchar(ch);
		ch=getc(fp);
	}
	putchar('\n');
	fclose(fp);
	printf("按任意键返回!!\n");
	system("pause");
	return;
}



/ 
void appointment_system()                              //预约系统页面 
{
	
	time_t timep;
    struct tm *p3;
    time (&timep);
    p3=gmtime(&timep);
	///
	system("cls");
	printf("\n欢迎来到预约系统页面!!\n");
	if(head==NULL)      //判断有无初始化 
	{
		printf("未进行初始化图书信息!!\n请按任意键返回!!\n");
		system("pause"); 
		return;
	}
	bookinformation *p;
	p=head;
	int count =1;
	printf("------------------------------------------------图书信息--------------------------------------------------------\n");
	printf("序号\t编号\t书名\t作者\t出版社\t类别\t出版时间\t价格\t库存\t已借出\n");
	while(p!=NULL)
	{
		if(p->num==0)
		{
			printf("%d\t%ld\t%s\t%s\t%s\t%s\t%ld\t%.1f\t%ld\t%ld\n",count,p->id,p->name,p->author,p->publisher,p->type,p->pubtime,p->price,p->num,p->bnum); 
			count++;
		}
		p=p->next; 

	 } 
	printf("\n以上为全部可预约的图书信息\n");
	printf("\n");
	system("pause");
	if(count == 1)
		return;
	p=head;
	ElemType *e;
	//
	borrowers *p5;
	p5=head1; 
	/
	e = (borrowers*)malloc(sizeof(borrowers));
	int tag =0;
	printf("请输入预约借阅信息信息\n(姓名、身份证、书名、年、月、日)\n");
	scanf("%s%ld%s%d%d%d",&e->name,&e->id,&e->bookname,&e->year,&e->month,&e->day);
	/
	while(p5!=NULL)
	{
		if((e->id==p5->id)&&(strcmp(e->name,p5->name)!=0))
		{
			printf("\n非常抱歉!!您输入的信息是错误的!!!\n");
			system("pause");
			Sleep(1000);
			return ;
			}
			p5=p5->next; 
		}
	///
	
	
	if((e->year>0&&e->year<=2023)&&(e->month>=1&&e->month<=(1+p3->tm_mon))&&(e->day>=1&&e->day<=30))
	{
		e->time = ((1900+p3->tm_year)*365+(1+p3->tm_mon)*31+p3->tm_mday)-(e->year*365+e->month*31+e->day);
		if(e->time>60)
		{
			e->money=(e->time-60)*2;
		}else
		{
			e->money=0;
		}
	}else
	{
		printf("\n输入信息有误!!\n");
		system("pause");
		return;
	}
	while(p!=NULL)
	{
		if((strcmp(p->name,e->bookname)==0)&&p->num==0)
		{
			tag=1;
			if(p->L.front==NULL)
			{
				InitQueue(&p->L);
			}
			
			if(InQueue(&p->L,e)==1)
				printf("\n排队预约成功!!\n");
			system("pause");
			break;
		}
		p=p->next;
	} 
	if(tag==0)
	{
		printf("\n输入信息有误!!\n");
		system("pause");
	}
}

 library.h文件

#ifndef _LIBRARY_H
#define _LIBRARY_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>     //strncpy()、srand()、rand()、strcmp().. 
#include <conio.h>      //getch()
#include <windows.h>    //Sleep()
#include <time.h>       //time(0) 
#define LEN sizeof(struct _bookinformation) 
#define LEN1 sizeof(struct _borrowers) 

///队列
typedef struct _borrowers ElemType;
typedef int Status;
typedef struct QNode{
	ElemType *data;
	struct QNode *next; 
}QNode,*QueuePtr;

typedef struct{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;
/


typedef struct _borrowers
{
	char name[30];           //借阅人名字
	long id;                 //借阅人身份证 
	char bookname[30];       //借阅书籍名字 
	int year;                //年        默认一年365天 
	int month;               //月        默认一个月31天 
	int day;                 //日 
	long time;               //已借天数         这里规定60天是最大期限天数 
	long money;              //罚款             这里规定每超过1天则罚款 2 元 
	struct _borrowers *next;
}borrowers;



typedef struct _bookinformation
{
	long id;                //图书编号 
	char name[30];          //书名
	char author[30];        //作者
	char publisher[50];     //出版社 
	char type[30];          //类别
	long pubtime;           //出版时间
	float price;             //价格
	long num;               //库存
	long bnum;              //已借出 
	struct _bookinformation * next;
	LinkQueue L;            //预约队列 
}bookinformation;


bookinformation *head = NULL;
borrowers *head1 = NULL; 

typedef struct  Administrators_users      //管理员的账号 
{
	char id[20];            //id代表账号 
	char pw[20];            //密码 
	char phone[11];         //手机号码 
}administrators_users;

///
void InitQueue(LinkQueue *L);        //初始化队列 
Status OutQueue(LinkQueue *L,ElemType *e);  //出队 
Status InQueue(LinkQueue*L,ElemType &e);   //入队



void character_menu();                       //选择角色(管理员和用户)页面 的菜单显示 
void notice_to_users(); 
 
void users_menu();                         //用户选择页面
void users_menu1();                        //用户选择页面菜单 



void administrators_menu();                         //管理员选择(登录、注册、找回)页面 
void administrators_menu1();                        //管理员选择页面的菜单显示 
void administrators_registers();                    //管理员账号注册页面
void administrators_login();                        //管理员账号登录页面 
void administrators_reback();                       //管理员密码找回页面 
void Create_File();                          //创建储存管理员用户账号密码的文件 administrators.txt


void administrators_side_operation();               //管理员端操作页面 
void administrators_side_operation_menu();          //管理员端操作页面的菜单显示 
bookinformation *creat();                    //初始化图书信息 
void add_book(bookinformation *head);                 //批量增加图书信息
bookinformation *del_book(bookinformation *head);             //批量删除图书信息 
void change_book(bookinformation *head);                //批量修改图书信息 

void reserve_book(bookinformation *head);               //保存图书信息(保存到book1.txt文件) 
void reserve_book1(bookinformation *head);            	// 保存图书信息(保存到book.txt文件) 
void Create_File1();                         			//创建储存图书信息的文件 book.txt(文本文件) 
void Create_File2();                         			//创建book1.txt(二进制) 

void print_book(bookinformation *head);                 //显示全部图书信息(遍历链表)
 
void find_book(bookinformation *head);            		//通过图书信息页面
void find_book_id(bookinformation *head);        	    //通过编号查询图书信息 
void find_book_name(bookinformation *head);             //通过书名查询图书信息 
void find_book_author(bookinformation *head); 	        //通过作者查询图书信息 
void find_book_publisher(bookinformation *head);       //通过出版社查询图书信息 
void find_book_price(bookinformation *head);		   //通过价格的范围查询图书信息 
void backup_book(bookinformation *head);       	  //备份图书信息(将book.txt备份到backup.txt)


bookinformation *sort(bookinformation *head);                       //排序选择页面 
int number_of_book(bookinformation *head);         					//计算图书数量
void print(bookinformation *head);    								//显示排序后的图书信息 
bookinformation *sort_book(int number , bookinformation *head , int(*compare)(bookinformation *p));   // 链表冒泡排序(最难的!!!) 
void swap(bookinformation *p);     																	 //交换p和p->next的内容 
int compare_id(bookinformation *p);      															 //比较p和p->next的编号大小 
int compare_pubtime(bookinformation *p);    														   //比较p和p->next的出版时间大小
int compare_price(bookinformation *p);      														 //比较p和p->next的价格大小 
int compare_num(bookinformation *p);      															 //比较p和p->next的库存大小 

void print_borrowers(borrowers *head1);        //显示已全部借阅人信息 

void borrowing_book();          //借阅图书 
borrowers *creat1();            //指向borrowers结构体类型指针函数用于创建链表
void returning_book();          //归还图书 

void users_suggestion_and_feedback();                       //管理员端建议与反馈箱
void administrators_suggestion_and_feedback();             //用户端建议与反馈箱
void Create_File3();                                        //建立admSgtFb.txt 


void Create_File4();                                       //建立announcement.txt
void administrators_announcement();                        //管理员端公告板 
void users_announcement();                                //用户端公告板 


void appointment_system();                                 //预约系统页面 
#endif

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言源代码的图书管理系统 #include<iostream.h> #include<fstream.H> #include<stdlib.h> #include<string.h> struct bookData { int booknumber; char bookname[30]; int store; }; struct Person { char name[20]; char studynumber[10]; int count; bookData Rbook[2]; //bookData Rbook; }; class History { public: History(fstream& a){readerbook=a;} void writehistory(); void readhistory(fstream&); private: fstream readerbook; }; class Liberian; void Find(fstream&); void CreateTxt(fstream&); class Reader { friend Liberian; public: Reader(fstream&); void print(); void handlebook(fstream&); void change(); bool findreader(); void Addreader(); void deletereader(); private: fstream file; Person person; }; class Liberian { public: Liberian(char *,char *); void changeReader(Reader&); void selfprint(); void Append(fstream&); private: char workname[20]; char worknumber[20]; }; int main() { fstream bookRecord(" book.dat",ios::in| ios::out); if(!bookRecord) { cerr<<" Can't open,try again!"<<endl; exit(1); } fstream readerRecord("reader.dat",ios::in|ios::out); if(!readerRecord) { cerr<<" Can't open,try again!"<<endl; exit(1); } int choice; int key; Reader reader(readerRecord);//读者管理系统 Liberian liberian("李天","123456");//图书管理员 History rec(readerRecord);//声明显示历史记录类 while(1) { cout<<" 请输入您的选择:\n\n" <<"1--图书管理员\n" <<"2--读者系统\n" <<"0--结束程序\n"; cin>>choice; switch(choice) { case 1: { cout<<" Hello,图书管理员:\n"; liberian.selfprint();cout<<endl; cout<<"1-- 增加新图书\n" <<"2-- 改变读者的属性\n" <<"3-- 显示历史记录\n" <<"0-- 返回\n"; cin>>key; switch(key) { case 1: liberian.Append(bookRecord); break; case 2: liberian.changeReader(reader); break; case 3: rec.readhistory(readerRecord); case 0: break ; } } break; case 2: { cout<<"学生读者\n"; int iflag=1; //reader.findreader(); cout<<"1-- 借书与还书信息\n" <<"2-- 修改个人信息\n" <<"0-- 返回\n"; cin>>key; switch(key) { case 1: reader.handlebook(bookRecord); break; case 2: reader.change(); break; case 0: break; } } break; default: return 0; } } return 0; } //增加书籍 void Liberian::Append(fstream& storef) { bookData book; int choice; int key; int num; storef.seekp(0,ios::end); int posEnd=storef.tellp(); cout<<"*************书籍入库***************"<<endl; while(1) { cout<<" Please enter your choice:"<<endl; cout<<"1--添加新书\n"<<"2--已有书籍\n"<<"0--返回\n"; cin>>choice; switch(choice) { case 1: cout<<" 书号, 书名, 数量?"<<endl; cin>>book.booknumber>>book.bookname>>book.store; storef.write(reinterpret_cast<char*>(&book),sizeof(bookData)); break; case 2: storef.seekg(0,ios::beg); cout<<"Booknumber?\n"; cin>>key; do{ storef.read(reinterpret_cast<char*>(&book),sizeof(bookData)); }while(book.booknumber!=key&&storef.tellg()!=posEnd); if(book.booknumber==key) { cout<<book.booknumber<<"----"<<book.bookname<<"----"<<book.store<<endl; cout<<" 输入已有书增加的数量:"<<endl; cin>>num; if(num>0) book.store+=num; else { cout<<" Invalid input"<<endl; } storef.seekp(-long(sizeof(bookData)),ios::cur);//////////////////// storef.write(reinterpret_cast<char*>(&book),sizeof(bookData)); cout<<"现在书籍: "<<book.bookname<<" 余量为: "<<book.store<<endl; } else cout<<"找不到此书,请重新查阅书号是否正确!"<<endl; break; case 0: return ; } } } //书籍查询 void Find(fstream & f) { bookData book; int key; int choice; f.seekg(0,ios::end); int posEnd=f.tellp(); cout<<"*************书籍查询***************"<<endl; while(1) { cout<<" 请输入您的选择\n" <<" 1-- 检索一本书\n" <<"2-- 显示全部书籍\n" <<"0-- 返回\n"; cin>>choice; switch(choice) { case 1: f.seekg(0,ios::beg); cout<<"输入你想检索书的书号"<<endl; cin>>key; do{ f.read(reinterpret_cast<char*>(&book),sizeof(bookData)); }while(book.booknumber!=key&&f.tellg()!=posEnd); if(book.booknumber==key) cout<<book.booknumber<<"---"<<book.bookname<<"---"<<book.store<<endl; else cout<<"找不到此书,请重新确认!"<<endl; break; case 2: f.seekg(0,ios::beg); do{ f.read(reinterpret_cast<char*>(&book),sizeof(bookData)); cout<<book.booknumber<<"---"<<book.bookname<<"--"<<book.store<<endl; }while(f.tellg()!=posEnd); break; case 0: return ; } } } Reader::Reader(fstream& c) { file=c; Person person={"0","0",0,{{0,"0",0}, {0,"0",0}}}; } void Reader::print() { cout<<"Name"<<"---"<<person.name<<'\n\n'<<"studynumber---"<<person.studynumber<<'\n'; } //操作书籍?????????????????????? void Reader::handlebook(fstream &filee) { int key; int choice; bookData book; bool iflag;int num=0; filee.seekp(0,ios::end); int posEnd=filee.tellp(); while(!(iflag=findreader())) { num++; if(num>=3) return; } //cout<<person.name; while(1) { cout<<"1-- 借书\n" <<"2-- 还书\n" <<"3-- 查找一本书\n" <<"0-- 返回"<<'\n'; cin>>choice; switch(choice) { case 1: { filee.seekp(0,ios::end); int posEnd=filee.tellp(); if(person.count<=1) { cout<<" 输入你要借阅图书的书号:"<<endl; cin>>key; filee.seekg(0); do{ filee.read(reinterpret_cast<char*>(&book),sizeof(bookData)); }while(book.booknumber!=key&&filee.tellp()!=posEnd); //cout<<book.booknumber<<endl; if(book.booknumber==key) { //cout<<" 找到你想借阅的图书,成功借阅!"<<endl; if(book.store>0) { person.Rbook[person.count]=book; person.count+=1; book.store-=1; filee.seekp(-long(sizeof(bookData)),ios::cur); filee.write(reinterpret_cast<char*>(&book),sizeof(bookData)); cout<<" 找到你想借阅的图书,成功借阅!"<<endl; cout<<"书籍 :"<<book.bookname<<"剩余的本数为:"<<book.store<<endl; } else cout<<" 现在此图书已经被借完了,请耐心等待几天!"<<endl; } else cout<<" 找不到你想要的图书"<<endl; } else cout<<"你最多只能借2本\n\n"; } break; case 2: { bookData blankbook={0,"0",0}; //if(person.count>0) //{ int iflag=0; filee.seekg(0); cout<<" 输入你想要还的书的书号:"<<endl; cin>>key; for(int i=0;i<2;i++) { if(key==person.Rbook[i].booknumber) { person.Rbook[i]=blankbook; cout<<"成功归还此书!"; iflag=1; person.count--; do{ filee.read(reinterpret_cast<char*>(&book),sizeof(bookData)); }while(book.booknumber!=key&&filee.tellp()!=posEnd); if(book.booknumber==key) { book.store+=1; filee.seekp(-long(sizeof(bookData)),ios::cur); filee.write(reinterpret_cast<char*>(&book),sizeof(bookData)); cout<<"书籍 :"<<book.bookname<<"余本量为: "<<book.store<<endl; } } } if(!iflag) { cout<<" 你没有借阅那本书,请确认!"<<endl; } // } // else // cout<<"你没有借书,请重新确认!\n\n"; } break; case 3: Find(filee); break; case 0: return; } } } void Reader::change() { char newname[20]; char newnumber[10]; int choice; file.seekp(0,ios::cur); int Posend=file.tellp(); bool iflag;int num=0; while(!(iflag=findreader())) { num++; if(num>=3) return; } cout<<" 请输入你的选择!"<<endl; cout<<"1--改变名字!\n" <<"2--修改学号r\n" <<"0--返回\n"; cin>>choice; switch(choice) { case 1: cout<<"输入你的新名字!\n"; cin>>newname; strcpy(person.name,newname); break; case 2: cout<<"输入你的信学号?\n"; cin>>newnumber; strcpy(person.studynumber,newnumber); break; default: break;; } file.seekp(-long(sizeof(Person)),ios::cur); file.write(reinterpret_cast<char*>(&person),sizeof(Person)); cout<<"信息修改成功!"<<endl; } void Liberian::selfprint() { cout<<" 图书管理员 :\n" <<worknumber<<"---"<<workname<<" 为您服务!\n"; } Liberian::Liberian(char *a,char*b) { strcpy(workname,a); strcpy(worknumber,b); } void Liberian::changeReader(Reader& a) { int choice; char newname[20];char newnumber[10]; cout<<"修改读者的数据信息!\n"; cout<<"1-- 增加一个读者\n" <<"2-- 删除一个读者\n" <<"0-- 结束程序\n"; cin>>choice; switch(choice) { case 1: a.Addreader(); break; case 2: a.deletereader(); break; case 0: return; } } void Reader::Addreader() { Person temp;bookData book={0,"0",0}; file.seekp(0,ios::end); int Posend=file.tellp(); cout<<"输入你想要增加的读者的名字"<<endl; cin>>temp.name; cout<<"新读者的学号:"<<endl; cin>>temp.studynumber; temp.Rbook[1]=book; temp.Rbook[0]=book; temp.count=0; file.write(reinterpret_cast<char*>(&temp),sizeof(Person)); cout<<" 成功添加!"<<temp.name<<endl; } void Reader::deletereader() { file.seekp(0,ios::end); int Posend=file.tellp(); Person person; char name[20]; cout<<"输入要删除的读者的名字!"<<endl; cin>>name; file.seekg(0); do{ file.read(reinterpret_cast<char*>(&person),sizeof(Person)); }while(strcmp(name,person.name)&&file.tellp()!=Posend); if(!strcmp(name,person.name)) { bookData blankbook={0,"0",0}; Person guest={"0","0",0,{{0,"0",0},{0,"0",0}}}; file.seekp(-long(sizeof(Person)),ios::cur); file.write(reinterpret_cast<char*>(&guest),sizeof(Person)); cout<<"成功删除!"<<person.name<<endl; } else cout<<"查无此人!"<<endl; } bool Reader::findreader() { file.seekp(0,ios::end); int Posend=file.tellp(); char name[20]; Person guest={"0","0",0,{{0,"0",0},{0,"0",0}}}; cout<<"输入查找人的名字!"; cin>>name; file.seekg(0); do{ file.read(reinterpret_cast<char*>(&person),sizeof(Person)); }while(strcmp(name,person.name)&&file.tellp()!=Posend); if(!strcmp(name,person.name)) { cout<<"查到此人:"<<person.name<<endl; return true; } else { cout<<"找不到此人,请重新确认!"<<endl; return false; } } //借阅历史 void History::readhistory(fstream& a) { readerbook=a; char name[10]="0"; readerbook.seekp(0,ios::end); int Posend=readerbook.tellp(); Person guest; int iflag=1; cout<<" 书籍借阅信息如下:"<<endl; cout<<"姓名 学号 借书量 书籍名"<<endl; readerbook.seekg(0,ios::beg); do{ readerbook.read(reinterpret_cast<char*>(&guest),sizeof(Person)); if(strcmp(guest.Rbook[1].bookname,name) || strcmp(guest.Rbook[1].bookname,name)) { cout<<guest.name<<" "<<guest.studynumber<<" "<<guest.count<<" "; for(int i=0;i<2;i++) if(strcmp(guest.Rbook[i].bookname,name)) cout<<guest.Rbook[i].bookname; iflag=0; } }while(readerbook.tellp()!=Posend); if(iflag) cout<<"没有读者借阅图书!"<<endl; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值