图书馆管理系统(详细)(C语言版本)

这里运用到一些文件,会在底层附上相应文件及其位置。

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
void start_show();        					//显示主面板 
void main_menu(int);         		   		//显示主菜单
int login_system(); 	  			   		//登陆系统
void registe_system();    			   		//注册系统
void exit_system();                    	 	//退出系统
void jiami_input(char*);   			//加密输入
void jiami_input_double(char*);		//加密输入重复 
void reader_management();  									//读者管理	
void reader_information_input(); 							//读者信息输入
void redear_information_modification(); 					//读者信息修改
void redear_information_deletion();    						//读者信息删除
void redear_information_found();  							//读者信息查询
void redear_information_display(); 							//读者信息显示
void book_management();								//图书管理 
void book_information_input();						//图书信息输入 
void book_information_modification();  				//图书信息修改 
void book_information_found(int); 		 			//图书信息查询 
void book_number_found();			//按书号查询
void book_title_found();			//按书名查询
void book_author_found();			//按作者查询
void book_press_found();			//按出版社查询
void book_statistic(); 				//汇总统计
void user_management();							//用户管理 
void user_information_input();					//用户信息输入
void user_information_modification();			//用户信息修改
void user_information_deletion();				//用户信息删除
void user_information_display();				//用户信息显示
void user_password_modification();				//用户密码修改
void book_liutong();					//图书流通管理 
void book_borrow();						//借书处理
void book_return();						//还书处理	
void book_borrow_found();			    //借阅查询
int write_user_data(struct User*, const char*);				//用户写入 
int write_reader_data(struct Reader*, const char*);			//读者写入 
int write_book_data(struct Book*, const char*);				//图书写入 
int write_br_data(struct Jilu*, const char*);				//借还书写入 
void free_user_data(struct User*);					//释放用户链表内存
void free_reader_data(struct Reader*);				//释放读者链表内存 
void free_book_data(struct Book*);					//释放图书链表内存 
void free_br_data(struct Jilu*);					//释放借还书链表内存 
void free_key_data(struct Key* head);				//释放检索表链表内存 
struct User* temp_lian_user(struct User*);				//临时用户链表 
struct Reader* temp_lian_reader(struct Reader*);		//临时读者链表 
struct Book* temp_lian_book(struct Book*);				//临时图书链表 
struct Jilu* temp_lian_br(struct Jilu*); 				//临时借还书记录链表 
struct Key* temp_lian_key(struct Key*, const char*);
struct Data current_system_time();					//提取系统当前时间 
void paixu_show(int);									//排序 
const char* user_data = "D://booksystem//User.txt";				//用户文件 
const char* reader_data = "D://booksystem//Reader.txt";			//读者文件 
const char* book_data = "D://booksystem//Book.txt";				//图书文件 
const char* br_data = "D://booksystem//Br.txt";					//借还书记录文件 
const char* name_data = "D://booksystem//book_name.txt"; 		//书名文件 
const char* author_data = "D://booksystem//book_aut.txt"; 		//作者文件 
const char* press_data = "D://booksystem//book_pre.txt"; 		//出版社文件 
const int can_borrow_num = 10;											//初始可借数
const int been_borrow_num = 0;											//初始已借数
struct User
{
	char id[100];
	char password[100];
	char type[100];
	struct User* next;
};
struct Reader
{
	int id;
	char name[100];
	char company[100];
	char tele[100];
	int can_borrow;
	int been_borrow;
	struct Reader* next;
};
struct Book
{
	int num;
	char id[100];
	char name[100];
	char author[100];
	char press[100];
	int have;
	int borrow;
	int p1;
	int p2;
	int p3;
	struct Book* next;
};
struct Data
{
	int year;
	int month;
	int day;
};
struct Jilu
{
	char reader_name[100];
	char book_id[100];
	struct Data borrow_data;
	struct Data return_data;
	struct Jilu* next;
};
struct Key
{
	char keyword[100];
	int head;
	int lengh;
	struct Key* next;
};
int main()
{
	start_show();
	return 0;
}
void start_show(void)
{
	system("cls");
	int n, flag = 1;
	do {
		printf("******WELCOME!******\n");
		printf("1.登录\n");
		printf("2.注册\n");
		printf("0.退出\n");
		printf("请输入相关数字:");
		scanf("%d", &n);
		switch (n)
		{
		case 1:	main_menu(login_system());
			break;
		case 2:registe_system();
			break;
		case 0:exit_system();
			break;
		default:flag = 0;
		}
		if (flag == 0)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag != 1);
}
int login_system()
{
	struct User u1, u2;
	int u = 0, flag = -1,count = 0;
	system("cls");
	printf("***登录***\n");
	printf("请输入用户名:");
	scanf("%s", u1.id);
	printf("请输入密码:");
	jiami_input(u1.password);
	FILE* p;
	do
	{
		p = fopen(user_data, "r");
		if (p != NULL)
		{
			while (fscanf(p, "%s%s%s", u2.id, u2.password, u2.type) != EOF)
			{
				if (strcmp(u1.id, u2.id) == 0 && strcmp(u1.password, u2.password) != 0)
				{
					flag = 1;
					count++;
					break;
				}
				else if (strcmp(u1.id, u2.id) != 0 && strcmp(u1.password, u2.password) == 0)
				{
					flag = 2;
					break;
				}
				else if (strcmp(u1.id, u2.id) == 0 && strcmp(u1.password, u2.password) == 0)
				{
					flag = 0;
					break;
				}
			}
			fclose(p);
			switch (flag)
			{
			case 1:
			{
				if(count < 3)
				{
					printf("登陆失败!\n");
					printf("您输入的密码有误!\n");
					printf("请重新输入密码!\n");
					jiami_input(u1.password);
					break;
				}
				else
				{
					printf("密码输入次数过多!\n");
					exit_system();
				}
			}
			case 2:
			case -1:
			{
				printf("登陆失败!\n");
				printf("您输入的用户名或密码错误!\n");
				printf("请重新输入!\n");
				printf("请输入用户名:");
				scanf("%s", u1.id);
				printf("请输入密码:");
				jiami_input(u1.password);
				break;
			}
			}
		}
		else
		{
			printf("\n");
			printf("文件未找到!\n");
			exit_system();
		}
	} while (flag != 0);
	if (strcmp(u2.type, "admin") == 0)
		u = 1;
	else if (strcmp(u2.type, "lib") == 0)
		u = 2;
	else if (strcmp(u2.type, "reader") == 0)
		u = 3;
	return u;
}
void registe_system()
{
	struct Reader r1;
	struct User us1, us2;
	system("cls");
	printf("\t\t****欢迎来到注册系统!****\n");
	printf("请输入你的用户名:");
	scanf("%s", us1.id);
	printf("请输入你的密码:");
	jiami_input_double(us1.password);
	printf("\n");
	printf("请输入你的姓名:");
	scanf("%s", r1.name);
	printf("请输入你的公司:");
	scanf("%s", r1.company);
	printf("请输入你的联系方式:");
	scanf("%s", r1.tele);
	int flag;
	do
	{
		flag = 0;
		FILE* fp = fopen(user_data, "r");
		while (fscanf(fp, "%s %s %s", us2.id, us2.password, us2.type) != EOF)
		{
			if (strcmp(us1.id, us2.id) == 0)
			{
				flag = 1;
				printf("该用户名已被注册,请重新输入!\n");
				printf("请输入用户名:");
				scanf("%s", us1.id);
				break;
			}
		}
		fclose(fp);
	} while (flag != 0);
	FILE* fpr = fopen(reader_data, "a");
	FILE* fpu = fopen(user_data, "a");
	if (fpr == NULL || fpu == NULL)
	{
		printf("文件打开失败!\n");
		exit_system();
	}
	else
	{
		fprintf(fpr, "%d %s %s %s %d %d\n", r1.id, r1.name, r1.company, r1.tele, can_borrow_num, been_borrow_num);
		fprintf(fpu, "%s %s %s\n", us1.id, us1.password, "reader");
		fclose(fpr);
		fclose(fpu);
	}
	int flag1;
	do
	{
		system("cls");
		printf("注册成功!\n");
		printf("1.返回主界面\n");
		printf("0.退出\n");
		printf("请输入对应编号\n");
		int n;
		scanf("%d", &n);
		flag1 = 0;
		switch (n)
		{
		case 1: start_show();
			break;
		case 0: exit_system();
			break;
		default: flag1 = 1;
		}
		if (flag1 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag1 != 0);
}
void main_menu(int u)
{
	if (u == 1)
	{
		int flag;
		do
		{
			system("cls");
			printf("\t\t***欢迎系统管理员登录***\n");
			printf("1.用户管理\n");
			printf("2.返回登录页面\n");
			printf("0.退出\n");
			printf("请输入对应编号!\n");
			int n1;
			flag = 0;
			scanf("%d", &n1);
			switch (n1)
			{
			case 1: user_management();
				break;
			case 2: start_show();
				break;
			case 0: exit_system();
				break;
			default: flag = 1;
			}
			if (flag == 1)
			{
				printf("输入错误,请重新输入\n");
				system("pause");
			}
		} while (flag != 0);
	}
	else if (u == 2)
	{
		int flag;
		do
		{
			system("cls");
			printf("\t\t****欢迎图书管理员登录****\n");
			printf("1.读者管理\n");
			printf("2.图书管理\n");
			printf("3.图书流通管理\n");
			printf("4.返回登录页面\n");
			printf("0.退出\n");
			printf("请输入对应编号!\n");
			int n1;
			scanf("%d", &n1);
			flag = 0;
			switch (n1)
			{
			case 1: reader_management();
				break;
			case 2: book_management();
				break;
			case 3: book_liutong();
				break;
			case 4: start_show();
				break;
			case 0: exit_system();
				break;
			default: flag = 1;
			}
			if (flag == 1)
			{
				printf("输入错误,请重新输入\n");
				system("pause");
			}
		} while (flag != 0);
	}
	else if (u == 3)
	{
		int flag;
		do
		{
			system("cls");
			printf("\t\t****欢迎读者登录****\n");
			printf("1.密码修改\n");
			printf("2.图书查询\n");
			printf("3.借阅查询\n");
			printf("4.返回登录页面\n");
			printf("0.退出\n");
			printf("请输入对应编号!\n");
			int n1;
			scanf("%d", &n1);
			flag = 0;
			switch (n1)
			{
			case 1:
			{
				user_password_modification();
				system("pause");
				int flag1;
				do
				{
					system("cls");
					printf("1.返回上一级\n");
					printf("0.退出\n");
					printf("请输入对应编号:");
					int n;
					flag1 = 0;
					scanf("%d", &n);
					switch (n)
					{
					case 1:	main_menu(3);
						break;
					case 0: exit_system();
						break;
					default: flag1 = 1;
					}
					if (flag1 == 1)
					{
						printf("输入有误,请重新输入:");
						system("pause");
					}
				} while (flag1 != 0);
				break;
			}

			case 2: book_information_found(1);
				break;
			case 3: book_borrow_found();
				break;
			case 4: start_show();
				break;
			case 0: exit_system();
				break;
			default: flag = 1;
			}
			if (flag == 1)
			{
				printf("输入错误,请重新输入\n");
				system("pause");
			}
		} while (flag != 0);
	}
}
void exit_system()
{
	printf("感谢使用!\n");
	exit(0);
}
void jiami_input(char* str)
{
	char password[100];
	int i = 0;
	while ((password[i] = _getch()) != '\r')
	{
		printf("*");
		i++;
	}
	password[i] = '\0';
	strcpy(str, password);
}
void jiami_input_double(char* str)
{
	char password[100];
	char password_a[100];
	int flag;
	do
	{
		int i = 0;
		flag = 0;
		while ((password[i] = _getch()) != '\r')
		{
			printf("*");
			i++;
		}
		password[i] = '\0';
		printf("\n");
		printf("请再次输入密码:");
		i = 0;
		while ((password_a[i] = _getch()) != '\r')
		{
			printf("*");
			i++;
		}
		password_a[i] = '\0';
		if (strcmp(password, password_a) != 0)
		{
			flag = 1;
			printf("两次输入的密码不一致,请重新输入!\n");
		}
	} while (flag != 0);
	strcpy(str, password);
}
void user_management()
{
	int flag;
	do
	{
		system("cls");
		printf("用户管理\n");
		printf("1.用户信息输入\n");
		printf("2.用户信息修改\n");
		printf("3.用户信息删除\n");
		printf("4.用户信息显示\n");
		printf("5.用户密码修改\n");
		printf("6.返回主菜单\n");
		printf("0.退出\n");
		int n;
		scanf("%d", &n);
		flag = 0;
		switch (n)
		{
		case 1: user_information_input();
			break;
		case 2: user_information_modification();
			break;
		case 3: user_information_deletion();
			break;
		case 4: user_information_display();
			break;
		case 5: user_password_modification();
			break;
		case 6: main_menu(1);
			break;
		case 0: exit_system();
			break;
		default: flag = 1;
		}
		if (flag == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag != 0);
}
void reader_management()
{
	int flag;
	do
	{
		system("cls");
		printf("读者管理\n");
		printf("1.读者信息输入\n");
		printf("2.读者信息修改\n");
		printf("3.读者信息删除\n");
		printf("4.读者信息查询\n");
		printf("5.读者信息显示\n");
		printf("6.返回主菜单\n");
		printf("0.退出\n");
		int n;
		scanf("%d", &n);
		flag = 0;
		switch (n)
		{
		case 1: reader_information_input();
			break;
		case 2: redear_information_modification();
			break;
		case 3: redear_information_deletion();
			break;
		case 4: redear_information_found();
			break;
		case 5: redear_information_display();
			break;
		case 6: main_menu(2);
			break;
		case 0: exit_system();
			break;
		default: flag = 1;
		}
		if (flag == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag != 0);
}
void book_management()
{
	int flag1;
	do
	{
		printf("1.图书信息输入\n");
		printf("2.图书信息修改\n");
		printf("3.图书信息查询\n");
		printf("4.汇总统计\n");
		printf("5.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n;
		scanf("%d", &n);
		flag1 = 0;
		switch (n)
		{
		case 1: book_information_input();
			break;
		case 2: book_information_modification();
			break;
		case 3: book_information_found(2);
			break;
		case 4:
			book_statistic();
			system("pasue");
			int flag2;
			do
			{
				system("cls");
				printf("1.返回上一级\n");
				printf("0.退出\n");
				printf("请输入对应编号:");
				int n1;
				scanf("%d", &n1);
				flag2 = 0;
				switch (n1)
				{
				case 1: book_management();
					break;
				case 0: exit_system();
					break;
				default: flag2 = 1;
				}
				if (flag2 == 1)
				{
					printf("输入有误,请重新输入:");
					system("pause");
				}
			} while (flag2 != 0);
		case 5: main_menu(2);
			break;
		case 0: exit_system();
			break;
		default: flag1 = 1;
		}
		if (flag1 == 1)
		{
			printf("输入有误,请重新输入:");
			system("pause");
		}
	} while (flag1 != 0);
}
void book_liutong()
{
	int flag1;
	do
	{
		system("cls");
		printf("1.借书处理\n");
		printf("2.还书处理\n");
		printf("3.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对用编号:");
		int n1;
		scanf("%d", &n1);
		flag1 = 0;
		switch (n1)
		{
		case 1: book_borrow();
			break;
		case 2: book_return();
			break;
		case 3: main_menu(2);
			break;
		case 0: exit_system();
			break;
		default: flag1 = 1;
		}
		if (flag1 == 1)
		{
			printf("输入有误,请重新输入:");
			system("pause");
		}
	} while (flag1 != 0);
}
void book_information_found(int n)
{
	int flag1;
	do
	{
		system("cls");
		printf("1.按书号查询\n");
		printf("2.按书名查询\n");
		printf("3.按作者查询\n");
		printf("4.按出版社查询\n");
		printf("5.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n1;
		scanf("%d", &n1);
		flag1 = 0;
		switch (n1)
		{
		case 1: book_number_found();
			break;
		case 2: book_title_found();
			break;
		case 3: book_author_found();
			break;
		case 4:	book_press_found();
			break;
		case 5:
		{
			if (n == 1)
				main_menu(3);
			else
				book_management();
			break;
		}
		case 0: exit_system();
			break;
		default: flag1 = 1;
		}
		if (flag1 == 1)
		{
			printf("输入有误,请重新输入:");
			system("pause");
		}
	} while (flag1 != 0);
}
void book_information_input()
{
	struct Book temp_xin;
	printf("请输入书号:");
	scanf("%s", temp_xin.id);
	printf("请输入书名:");
	scanf("%s", temp_xin.name);
	printf("请输入书作者:");
	scanf("%s", temp_xin.author);
	printf("请输入书出版社:");
	scanf("%s", temp_xin.press);
	printf("请输入书库存:");
	scanf("%d", &temp_xin.have);
	temp_xin.borrow = 0;
	printf("请输入相关检索信息:");
	scanf("%d %d %d", &temp_xin.p1, &temp_xin.p2, &temp_xin.p3);
	struct Book* head = NULL;
	FILE* fp = fopen(book_data, "r");
	if (fp == NULL)
	{
		printf("文件打开失败!\n");
		exit_system();
	}
	else
	{
		struct Book temp;
		struct Book* current = NULL, * prev = NULL;
		int i = 0;
		while (fscanf(fp, "%d %s %s %s %s %d %d %d %d %d", &temp.num, temp.id, temp.name, temp.author, temp.press, &temp.have, &temp.borrow, &temp.p1, &temp.p2, &temp.p3) != EOF)
		{
			i++;
			current = (struct Book*)malloc(sizeof(struct Book));
			current->num = temp.num;
			strcpy(current->id, temp.id);
			strcpy(current->name, temp.name);
			strcpy(current->author, temp.author);
			strcpy(current->press, temp.press);
			current->have = temp.have;
			current->borrow = temp.borrow;
			current->p1 = temp.p1;
			current->p2 = temp.p2;
			current->p3 = temp.p3;
			current->next = NULL;
			if (head == NULL)
				head = current;
			else
				prev->next = current;
			prev = current;
		}
		current = (struct Book*)malloc(sizeof(struct Book));
		current->num = i;
		strcpy(current->id, temp_xin.id);
		strcpy(current->name, temp_xin.name);
		strcpy(current->author, temp_xin.author);
		strcpy(current->press, temp_xin.press);
		current->have = temp_xin.have;
		current->borrow = temp_xin.borrow;
		current->p1 = temp_xin.p1;
		current->p2 = temp_xin.p2;
		current->p3 = temp_xin.p3;
		current->next = NULL;
		prev->next = current;
	}
	fclose(fp);
	int flag;
	flag = write_book_data(head, book_data);
	if (flag == 0)
		printf("写入失败!\n");
	else
		printf("写入成功!\n");
	system("pause");
	int flag1;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n1;
		scanf("%d", &n1);
		flag1 = 0;
		switch (n1)
		{
		case 1: book_management();
			break;
		case 0: exit_system();
			break;
		default: flag1 = 1;
		}
		if (flag1 == 1)
		{
			printf("输入有误,请重新输入:");
			system("pause");
		}
	} while (flag1 != 0);
}
void book_information_modification()
{
	struct Book temp;
	struct Book* head = NULL, * p, * L;
	int flag1 = 1;
	L = p = temp_lian_book(head);
	printf("请输入书本号:");
	scanf("%s", temp.id);
	while (p)
	{
		if (strcmp(temp.id, p->id) == 0)
		{
			flag1 = 0;
			printf("请输入书本库存:");
			scanf("%d", &p->have);
		}
		p = p->next;
	}
	if (flag1)
		printf("未找到该书\n");
	else
	{
		if (write_book_data(L, book_data) == 0)
			printf("写入失败\n");
		else
			printf("写入成功\n");
	}
	system("pause");
	int flag2;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n1;
		flag2 = 0;
		scanf("%d", &n1);
		switch (n1)
		{
		case 1:	book_management();
			break;
		case 0: exit_system();
			break;
		default: flag2 = 1;
		}
		if (flag2 == 1)
		{
			printf("输入有误,请重新输入:");
			system("pause");
		}
	} while (flag2 != 0);
}
void book_borrow_found()
{
	char temp_id[100];
	struct Reader* head = NULL, * p, * L;
	int flag1 = 1;
	p = L = temp_lian_reader(head);
	printf("请输入你的用户名:");
	scanf("%s", temp_id);
	while (p)
	{
		if (strcmp(temp_id, p->name) == 0)
		{
			flag1 = 0;
			printf("可借数量为:");
			printf("%d\n", p->can_borrow);
			printf("已借数量为:");
			printf("%d\n", p->been_borrow);
		}
		p = p->next;
	}
	if (flag1)
	{
		printf("用户名未找到!\n");
		system("pause");
	}
	int flag2;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n1;
		flag2 = 0;
		scanf("%d", &n1);
		switch (n1)
		{
		case 1:	main_menu(3);
			break;
		case 0: exit_system();
			break;
		default: flag2 = 1;
		}
		if (flag2 == 1)
		{
			printf("输入有误,请重新输入:");
			system("pause");
		}
	} while (flag2 != 0);
}
void book_statistic()
{
	system("cls");
	struct Book* head = NULL, * p, * kill;
	p = kill = temp_lian_book(head);
	while (p)
	{
		printf("%s %s %s %s %d\n", p->id, p->name, p->author, p->press, p->have - p->borrow);
		p = p->next;
	}
	free_book_data(kill);
	system("pause"); 
}
void user_information_input()
{
	system("cls");
	struct User* head = NULL;
	struct User temp_xin;
	FILE* fp = fopen(user_data, "r");
	if (fp == NULL)
	{
		printf("文件打开失败!\n");
		system("pause");
		exit_system();
	}
	else
	{
		printf("请输入新用户名:");
		scanf("%s", temp_xin.id);
		printf("请输入新用户密码:");
		jiami_input(temp_xin.password);
		printf("\n");
		printf("请输入新用户类型:");
		scanf("%s", temp_xin.type);
		struct User temp;
		struct User* current = NULL, * prev = NULL; \
			while (fscanf(fp, "%s %s %s", temp.id, temp.password, temp.type) != EOF)
			{
				current = (struct User*)malloc(sizeof(struct User));
				strcpy(current->id, temp.id);
				strcpy(current->password, temp.password);
				strcpy(current->type, temp.type);
				current->next = NULL;
				if (head == NULL)
					head = current;
				else
					prev->next = current;
				prev = current;
			}
		current = (struct User*)malloc(sizeof(struct User));
		strcpy(current->id, temp_xin.id);
		strcpy(current->password, temp_xin.password);
		strcpy(current->type, temp_xin.type);
		current->next = NULL;
		if (head == NULL)
			head = current;
		else
			prev->next = current;
	}
	if (write_user_data(head, user_data) == 0)
		printf("写入失败!\n");
	else
		printf("写入成功!\n");
	system("pause");
	int flag;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号!\n");
		int n;
		scanf("%d", &n);
		flag = 0;
		switch (n)
		{
		case 1: user_management();
			break;
		case 0:	exit_system();
			break;
		default: flag = 1;
		}
		if (flag == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag != 0);
}
void user_information_modification()
{
	int flag;
	int flag1 = 0;
	do
	{
		system("cls");
		printf("1.用户类型\n");
		printf("2.重置密码\n");
		printf("0.返回上一级\n");
		printf("请输入对应编号:");
		int n;
		scanf("%d", &n);
		flag = 0;
		switch (n)
		{
		case 1: flag1 = 1;
			break;
		case 2: flag1 = 2;
			break;
		case 0: user_management();
			break;
		default: flag = 1;
		}
		if (flag == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag != 0);
	if (flag1 == 1)
	{
		system("cls");
		char temp_id[100];
		struct User* head = NULL, * p, * L;
		int flag2 = 1;
		p = L = temp_lian_user(head);
		printf("请输入要修改信息用户名:");
		scanf("%s", temp_id);
		while (p)
		{
			if (strcmp(temp_id, p->id) == 0)
			{
				flag2 = 0;
				printf("请输入用户新类型:");
				scanf("%s", p->type);
			}
			p = p->next;
		}
		if (flag2)
			printf("未找到该用户!\n");
		else
		{
			if (write_user_data(L, user_data) == 0)
				printf("写入失败!\n");
			else
				printf("写入成功!\n");
		}
		system("pause");
		int flag3;
		do
		{
			system("cls");
			printf("1.返回上一级\n");
			printf("0.退出\n");
			int n1;
			scanf("%d", &n1);
			flag3 = 0;
			switch (n1)
			{
			case 1: user_information_modification();
				break;
			case 0: exit_system();
				break;
			default:flag3 = 1;
			}
			if (flag3 == 1)
			{
				printf("输入有误,请重新输入!\n");
				system("pause");
			}
		} while (flag3 != 0);
	}
	else if (flag1 == 2)
	{
		system("cls");
		char temp_id[100];
		struct User* head = NULL, * p, * L;
		int flag2 = 1;
		p = L = temp_lian_user(head);
		printf("请输入要修改信息用户名:");
		scanf("%s", temp_id);
		while (p)
		{
			if (strcmp(temp_id, p->id) == 0)
			{
				flag2 = 0;
				strcpy(p->password, "123123");
			}
			p = p->next;
		}
		if (flag2)
			printf("未找到该用户!\n");
		else
		{
			if (write_user_data(L, user_data) == 0)
				printf("重置失败!\n");
			else
				printf("重置成功!\n密码为:123123\n");
		}
		system("pause");
		int flag3;
		do
		{
			system("cls");
			printf("1.返回上一级\n");
			printf("0.退出\n");
			int n1;
			scanf("%d", &n1);
			flag3 = 0;
			switch (n1)
			{
			case 1: user_information_modification();
				break;
			case 0: exit_system();
				break;
			default:flag3 = 1;
			}
			if (flag3 == 1)
			{
				printf("输入有误,请重新输入!\n");
				system("pause");
			}
		} while (flag3 != 0);
	}
}
void user_information_deletion()
{
	system("cls");
	char temp_id[100];
	struct User* up, * utail, * uhead = NULL, * ukill;
	int flag1 = 1;
	up = utail = uhead = temp_lian_user(uhead);
	printf("请输入需要删除的用户名:");
	scanf("%s", temp_id);
	while (up)
	{
		if (strcmp(up->id, temp_id) == 0)
		{
			flag1 = 0;
			if (up == uhead)
				uhead = uhead->next;
			else
				utail->next = up->next;
			ukill = up;
			up = up->next;
			free(ukill);
		}
		else
		{
			utail = up;
			up = up->next;
		}
	}
	struct Reader* rp, * rtail, * rhead = NULL, * rkill;
	int flag2 = 1;
	rp = rtail = rhead = temp_lian_reader(rhead);
	while (rp)
	{
		if (strcmp(rp->name, temp_id) == 0)
		{
			flag2 = 0;
			if (rp == rhead)
				rhead = rhead->next;
			else
				rtail->next = rp->next;
			rkill = rp;
			rp = rp->next;
			free(rkill);
		}
		else
		{
			rtail = rp;
			rp = rp->next;
		}
	}
	if (flag1 || flag2)
		printf("未找到该用户!\n");
	else
	{
		int s_flag1 = 1, s_flag2 = 1;
		s_flag1 = write_user_data(uhead, user_data);
		s_flag2 = write_reader_data(rhead, reader_data);
		if (s_flag1 == 0 && s_flag2 == 0)
			printf("删除失败!\n");
		else
			printf("删除成功!\n");
	}
	system("pause");
	int flag3;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号\n");
		int n;
		scanf("%d", &n);
		flag3 = 0;
		switch (n)
		{
		case 1: user_management();
			break;
		case 2: exit_system();
			break;
		default: flag3 = 1;
		}
		if (flag3 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag3 != 0);
}
void user_information_display()
{
	paixu_show(1);
	system("pause");
	int flag;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号\n");
		int n;
		scanf("%d", &n);
		flag = 0;
		switch (n)
		{
		case 1: user_management();
			break;
		case 2: exit_system();
			break;
		default: flag = 1;
		}
		if (flag == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag != 0);
}
void user_password_modification()
{
	system("cls");
	char temp_id[100];
	char temp_password[100];
	char old_password[100];
	struct User* head = NULL, * p, * L;
	int flag1 = 1;
	L = p = temp_lian_user(head);
	printf("请输入用户名:");
	scanf("%s", temp_id);
	while (p)
	{
		if (strcmp(temp_id, p->id) == 0)
		{
			flag1 = 0;
			int flag2 = 1;
			do
			{
				printf("请输入原密码:");
				jiami_input(old_password);
				if (strcmp(old_password, p->password) == 0)
				{
					flag2 = 0;
					printf("\n");
					printf("请输入新密码:");
					jiami_input(temp_password);
					strcpy(p->password, temp_password);
				}
				else
				{
					printf("原密码错误,请重新输入!\n");
					system("pause");
				}
			} while (flag2 != 0);
			break;
		}
		p = p->next;
	}
	if (flag1 == 1)
		printf("未找到用户!\n");
	else
	{
		int flag3 = 1;
		flag3 = write_user_data(L, user_data);
		if (flag3 == 0)
			printf("修改失败!\n");
		else
			printf("修改成功!\n");
	}
}
void reader_information_input()
{
	int flag1 = 1, flag2 = 1;
	struct User* head = NULL;
	struct User temp_xin;
	FILE* fp = fopen(user_data, "r");
	if (fp == NULL)
	{
		printf("文件打开失败!\n");
		system("pause");
		exit_system();
	}
	else
	{
		printf("请输入新用户名:");
		scanf("%s", temp_xin.id);
		printf("请输入新用户密码:");
		jiami_input(temp_xin.password);
		strcpy(temp_xin.type, "reader");
		struct User temp;
		struct User* current = NULL, * prev = NULL;
		while (fscanf(fp, "%s %s %s", temp.id, temp.password, temp.type) != EOF)
		{
			current = (struct User*)malloc(sizeof(struct User));
			strcpy(current->id, temp.id);
			strcpy(current->password, temp.password);
			strcpy(current->type, temp.type);
			current->next = NULL;
			if (head == NULL)
				head = current;
			else
				prev->next = current;
			prev = current;
		}
		current = (struct User*)malloc(sizeof(struct User));
		strcpy(current->id, temp_xin.id);
		strcpy(current->password, temp_xin.password);
		strcpy(current->type, temp_xin.type);
		current->next = NULL;
		if (head == NULL)
			head = current;
		else
			prev->next = current;
	}
	struct Reader* rhead = NULL, * rrp = NULL;
	struct Reader rtemp_xin;
	FILE* rfp = fopen(reader_data, "r");
	if (rfp == NULL)
	{
		printf("文件打开失败!\n");
		system("pause");
		exit_system();
	}
	else
	{
		struct Reader* rcurrent = NULL, * rprev = NULL;
		while (fscanf(rfp, "%d %s %s %s %d %d", &rtemp_xin.id, rtemp_xin.name, rtemp_xin.company, rtemp_xin.tele, &rtemp_xin.can_borrow, &rtemp_xin.been_borrow) != EOF)
		{
			rcurrent = (struct Reader*)malloc(sizeof(struct Reader));
			rcurrent->id = rtemp_xin.id;
			strcpy(rcurrent->name, rtemp_xin.name);
			strcpy(rcurrent->company, rtemp_xin.company);
			strcpy(rcurrent->tele, rtemp_xin.tele);
			rcurrent->can_borrow = rtemp_xin.can_borrow;
			rcurrent->been_borrow = rtemp_xin.been_borrow;
			rcurrent->next = NULL;
			if (rhead == NULL)
				rhead = rcurrent;
			else
				rprev->next = rcurrent;
			rprev = rcurrent;
		}
		printf("请输入读者工作单位:");
		scanf("%s", rtemp_xin.company);
		printf("请输入读者联系方式:");
		scanf("%s", rtemp_xin.tele);
		rcurrent = (struct Reader*)malloc(sizeof(struct Reader));
		rcurrent->id = rtemp_xin.id + 1;
		strcpy(rcurrent->name, temp_xin.id);
		strcpy(rcurrent->company, rtemp_xin.company);
		strcpy(rcurrent->tele, rtemp_xin.tele);
		rcurrent->can_borrow = can_borrow_num;
		rcurrent->been_borrow = been_borrow_num;
		rcurrent->next = NULL;
		if (rhead == NULL)
			rhead = rcurrent;
		else
			rprev->next = rcurrent;

	}
	rrp = rhead;
	while (rrp)
	{
		printf("id=%d\n", rrp->id);
		rrp = rrp->next;
	}
	flag1 = write_user_data(head, user_data);
	flag2 = write_reader_data(rhead, reader_data);
	if (flag1 == 0 || flag2 == 0)
		printf("写入失败!\n");
	else
		printf("写入成功!\n");
	system("pause");
	int flag3;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号\n");
		int n;
		scanf("%d", &n);
		flag3 = 0;
		switch (n)
		{
		case 1: reader_management();
			break;
		case 0: exit_system();
			break;
		default: flag3 = 1;
		}
		if (flag3 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag3 != 0);
}
void redear_information_modification()
{
	struct Reader temp_xin;
	char temp_id[100];
	struct Reader* head = NULL, * rp, * L;
	int flag1 = 1;
	rp = L = temp_lian_reader(head);
	printf("请输入要修改信息用户名:");
	scanf("%s", temp_id);
	while (rp)
	{
		if (strcmp(temp_id, rp->name) == 0)
		{
			flag1 = 0;
			printf("请输入读者号:");
			scanf("%d", &temp_xin.id);
			printf("请输入读者新工作单位:");
			scanf("%s", temp_xin.company);
			strcpy(rp->company, temp_xin.company);
			printf("请输入读者新联系方式:");
			scanf("%s", temp_xin.tele);
			strcpy(rp->tele, temp_xin.tele);
		}
		rp = rp->next;
	}
	if (flag1)
		printf("未找到该用户!\n");
	else
	{
		if (write_reader_data(L, reader_data) == 0)
			printf("写入失败!\n");
		else
			printf("写入成功!\n");
	}
	system("pause");
	int flag3;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		int n1;
		scanf("%d", &n1);
		flag3 = 0;
		switch (n1)
		{
		case 1: reader_management();
			break;
		case 0: exit_system();
			break;
		default:flag3 = 1;
		}
		if (flag3 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag3 != 0);
}
void redear_information_deletion()
{
	char temp_xin[100];
	struct User* head = NULL, * up, * uhead, * utail, * ukill;
	up = uhead = utail = temp_lian_user(head);
	int flag1 = 1;
	printf("qingshuru:");
	scanf("%s", temp_xin);
	while (up)
	{
		if (strcmp(temp_xin, up->id) == 0)
		{
			flag1 = 0;
			if (up == uhead)
				uhead = uhead->next;
			else
				utail->next = up->next;
			ukill = up;
			up = up->next;
			free(ukill);
		}
		else
		{
			utail = up;
			up = up->next;
		}
	}
	struct Reader* rrhead = NULL, * rp, * rhead = NULL, * rtail, * rkill;
	rp = rhead = rtail = temp_lian_reader(rhead);
	int flag2 = 1;
	while (rp)
	{
		if (strcmp(temp_xin, rp->name) == 0)
		{
			flag2 = 0;
			if (rp == rhead)
				rhead = rhead->next;
			else
				rtail->next = rp->next;
			rkill = rp;
			rp = rp->next;
			free(rkill);
		}
		else
		{
			rtail = rp;
			rp = rp->next;
		}
	}
	if (flag1 || flag2)
		printf("weizhaodao\n");
	else
	{
		int flag3 = 1;
		int flag4 = 1;
		flag3 = write_user_data(uhead, user_data);
		flag4 = write_reader_data(rhead, reader_data);
		if (flag3 == 0)
			printf("shanchushibai!\n");
		else
			printf("shanchuchenggong!\n");
	}
	system("pause");
	int flag5;
	do
	{
		system("cls");
		printf("1.fanhui\n");
		printf("0.tuichu\n");
		printf("qingshuru:");
		int n;
		scanf("%d", &n);
		flag5 = 0;
		switch (n)
		{
		case 1: reader_management();
			break;
		case 2: exit_system();
			break;
		default: flag5 = 1;
		}
		if (flag5 == 1)
		{
			printf("wuruyouwu\n");
			system("pause");
		}
	} while (flag5 != 0);
}
void redear_information_found()
{
	char temp_xin[100];
	printf("请输入用户名:");
	scanf("%s", temp_xin);
	struct Reader* rhead = NULL, * rp, * rtail;
	rp = rtail = temp_lian_reader(rhead);
	int flag1 = 1;
	while (rp)
	{
		if (strcmp(temp_xin, rp->name) == 0)
		{
			flag1 = 0;
			printf("序号:%d\n", rp->id);
			printf("用户名:%s\n", rp->name);
			printf("公司:%s\n", rp->company);
			printf("联系方式:%s\n", rp->tele);
			printf("可借:%d\n", rp->can_borrow);
			printf("已借:%d\n", rp->been_borrow);
			system("pause");
			break;
		}
		else
		{
			rtail = rp;
			rp = rp->next;
		}
	}
	if (flag1)
	{
		printf("未找到该用户!\n");
		system("pause");
	}
	int flag2;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		flag2 = 0;
		int n;
		scanf("%d", &n);
		switch (n)
		{
		case 1: reader_management();
			break;
		case 0: exit_system();
			break;
		default: flag2 = 1;
		}
		if (flag2 == 1)
		{
			printf("输入有误,请重新输入\n");
			system("pause");
		}
	} while (flag2 != 0);
}
void redear_information_display()
{
	paixu_show(2);
	system("pause");
	int flag1;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n;
		scanf("%d", &n);
		flag1 = 0;
		switch (n)
		{
		case 1: reader_management();
			break;
		case 2: exit_system();
			break;
		default: flag1 = 1;
		}
		if (flag1 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag1 != 0);
}
int write_user_data(struct User* head, const char* wenjian)
{
	FILE* fp = fopen(wenjian, "w");
	struct User* kill = head;
	if (fp == NULL)
		return 0;
	while (head)
	{
		fprintf(fp, "%s %s %s\n", head->id, head->password, head->type);
		head = head->next;
	}
	free_user_data(kill);
	fclose(fp);
	return 1;
}
int write_reader_data(struct Reader* head, const char* wenjian)
{
	FILE* fp = fopen(wenjian, "w");
	struct Reader* kill = head;
	if (fp == NULL)
		return 0;
	while (head)
	{
		fprintf(fp, "%d %s %s %s %d %d\n", head->id, head->name, head->company, head->tele, head->can_borrow, head->been_borrow);
		head = head->next;
	}
	free_reader_data(kill);
	fclose(fp);
	return 1;
}
int write_book_data(struct Book* head, const char* wenjian)
{
	FILE* fp = fopen(wenjian, "w");
	struct Book* kill = head;
	if (fp == NULL)
		return 0;
	while (head)
	{
		fprintf(fp, "%d %s %s %s %s %d %d %d %d %d\n", head->num, head->id, head->name, head->author, head->press, head->have, head->borrow, head->p1, head->p2, head->p3);
		head = head->next;
	}
	free_book_data(kill);
	fclose(fp);
	return 1;
}
void free_user_data(struct User* head)
{
	struct User* freehead;
	while (head != NULL)
	{
		freehead = head;
		head = head->next;
		free(freehead);
	}
}
void free_reader_data(struct Reader* head)
{
	struct Reader* freehead;
	while (head != NULL)
	{
		freehead = head;
		head = head->next;
		free(freehead);
	}
}
void free_book_data(struct Book* head)
{
	struct Book* freehead;
	while (head != NULL)
	{
		freehead = head;
		head = head->next;
		free(freehead);
	}
}
struct Book* temp_lian_book(struct Book* head)
{
	FILE* fp = fopen(book_data, "r");
	if (NULL == fp)
	{
		printf("系统出错,文件打开失败!\n");
		exit_system();
	}
	else
	{
		struct Book temp;
		struct Book* current = NULL, * prev = NULL;
		while (fscanf(fp, "%d %s %s %s %s %d %d %d %d %d", &temp.num, temp.id, temp.name, temp.author, temp.press, &temp.have, &temp.borrow, &temp.p1, &temp.p2, &temp.p3) != EOF)
		{
			current = (struct Book*)malloc(sizeof(struct Book));
			current->num = temp.num;
			strcpy(current->id, temp.id);
			strcpy(current->name, temp.name);
			strcpy(current->author, temp.author);
			strcpy(current->press, temp.press);
			current->have = temp.have;
			current->borrow = temp.borrow;
			current->p1 = temp.p1;
			current->p2 = temp.p2;
			current->p3 = temp.p3;
			current->next = NULL;
			if (NULL == head)
				head = current;
			else
				prev->next = current;
			prev = current;
		}
	}
	return head;
}
struct User* temp_lian_user(struct User* head)
{
	FILE* fp = fopen(user_data, "r");
	if (fp != NULL)
	{
		struct User temp;
		struct User* current = NULL, * prev = NULL;
		while (fscanf(fp, "%s %s %s", temp.id, temp.password, temp.type) != EOF)
		{
			current = (struct User*)malloc(sizeof(struct User));
			strcpy(current->id, temp.id);
			strcpy(current->password, temp.password);
			strcpy(current->type, temp.type);
			current->next = NULL;
			if (head == NULL)
				head = current;
			else
				prev->next = current;
			prev = current;
		}
	}
	else
	{
		printf("系统出错\n");
		exit_system();
	}
	return head;
}
struct Reader* temp_lian_reader(struct Reader* head)
{
	FILE* fp = fopen(reader_data, "r");
	if (fp != NULL)
	{
		struct Reader temp;
		struct Reader* current = NULL, * prev = NULL;
		while (fscanf(fp, "%d %s %s %s %d %d", &temp.id, temp.name, temp.company, temp.tele, &temp.can_borrow, &temp.been_borrow) != EOF)
		{
			current = (struct Reader*)malloc(sizeof(struct Reader));
			current->id = temp.id;
			strcpy(current->name, temp.name);
			strcpy(current->company, temp.company);
			strcpy(current->tele, temp.tele);
			current->can_borrow = temp.can_borrow;
			current->been_borrow = temp.been_borrow;
			current->next = NULL;
			if (head == NULL)
				head = current;
			else
				prev->next = current;
			prev = current;
		}
	}
	else
	{
		printf("系统出错\n");
		exit_system();
	}
	return head;
}
void paixu_show(int n)
{
	system("cls");
	if (n == 1)
	{
		struct User* head = NULL, * p, * p1, * p2, * x, * t;
		p = temp_lian_user(head);
		p1 = p->next;
		p->next = NULL;
		while (p1 != NULL)
		{
			x = p;
			p2 = p->next;
			while (p2 != NULL && strcmp(p2->id, p1->id) <= 0)
			{
				x = p2;
				p2 = p2->next;
			}
			t = p1->next;
			p1->next = p2;
			x->next = p1;
			p1 = t;
		}
		p1 = p;
		struct User* kill = p1;
		while (p1 != NULL)
		{
			printf("%s %s\n", p1->id, p1->type);
			p1 = p1->next;
		}
		free_user_data(kill);
	}
	if (2 == n)
	{
		struct Reader* head = NULL, * p, * p1, * p2, * x, * t;
		p = temp_lian_reader(head);
		p1 = p->next;
		p->next = NULL;
		while (p1 != NULL)
		{
			x = p;
			p2 = p->next;
			while (p2 != NULL && strcmp(p2->name, p1->name) <= 0)
			{
				x = p2;
				p2 = p2->next;
			}
			t = p1->next;
			p1->next = p2;
			x->next = p1;
			p1 = t;
		}
		p1 = p;
		while (p1 != NULL)
		{
			printf("%d %s %s %d %d\n", p1->id, p1->company, p1->tele, p1->can_borrow, p1->been_borrow);
			p1 = p1->next;
		}
		struct Reader* kill = p1;
		free_reader_data(kill);
	}
}
void book_borrow()
{
	char book_id[100];
	char reader_name[100];
	printf("请输入用户名:");
	scanf("%s", reader_name);
	printf("请输入书本号:");
	scanf("%s", book_id);
	struct Reader* head = NULL, * p;
	int flag1 = 1;
	p = temp_lian_reader(head);
	while (p)
	{
		if (strcmp(reader_name, p->name) == 0)
		{
			flag1 = 0;
			if (p->can_borrow > p->been_borrow)
			{
				int flag2 = 0;
				struct Jilu* jhead = NULL, * jp = NULL, * jL = NULL;
				jL = jp = temp_lian_br(jhead);
				while (jp)
				{
					if (strcmp(reader_name, jp->reader_name) == 0 && strcmp(book_id, jp->book_id) == 0 && jp->return_data.year == 0)
					{
						flag2 = 1;
						break;
					}
					jp = jp->next;
				}
				if (flag2)
				{
					printf("该用户已借此书,并未归还!\n");
					printf("借书日期:%d-%d-%d\n", jp->borrow_data.year, jp->borrow_data.month, jp->borrow_data.day);
				}
				else
				{
					struct Book* p, * head = NULL;
					int flag3 = 1;
					p = temp_lian_book(head);
					while (p)
					{
						if (strcmp(book_id, p->id) == 0)
						{
							flag3 = 0;
							if (p->have > p->borrow)
							{
								struct Jilu* head = NULL, * p = NULL, * L = NULL;
								L = p = temp_lian_br(head);
								if (p != NULL)
									while (p->next)
										p = p->next;
								struct Jilu* current = NULL;
								struct Data nowtime = current_system_time();
								current = (struct Jilu*)malloc(sizeof(struct Jilu));
								strcpy(current->reader_name, reader_name);
								strcpy(current->book_id, book_id);
								current->borrow_data.year = nowtime.year;
								current->borrow_data.month = nowtime.month;
								current->borrow_data.day = nowtime.day;
								current->return_data.year = 0;
								current->return_data.month = 0;
								current->return_data.day = 0;
								current->next = NULL;
								if (L == NULL)
									L = current;
								else
									p->next = current;
								int f;
								f = write_br_data(L, br_data);
								if (f == 0)
									printf("写入失败!\n");
								else
									printf("写入成功!\n");
								struct Book* bhead = NULL, * bp, * bL;
								bL = bp = temp_lian_book(bhead);
								while (bp)
								{
									if (strcmp(book_id, bp->id) == 0)
										bp->borrow++;
									bp = bp->next;
								}
								if (write_book_data(bL, book_data) == 0)
									printf("写入失败!\n");
								else
									printf("写入成功!\n");
								struct Reader* rhead = NULL, * rp, * rL;
								rp = rL = temp_lian_reader(rhead);
								while (rp)
								{
									if (strcmp(reader_name, rp->name) == 0)
										rp->been_borrow++;
									rp = rp->next;
								}
								if (write_reader_data(rL, reader_data) == 0)
									printf("写入失败!\n");
								else
									printf("写入成功!\n");
							}
							else
								printf("此书已全部借出!\n");
						}
						p = p->next;
					}
					if (flag3)
						printf("未找到此书!\n");
				}
			}
			else
				printf("已达最大可借数!\n");
		}
		p = p->next;
	}
	if (flag1)
		printf("未找到该用户!\n");
	system("pause");
	int flag4;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n;
		scanf("%d", &n);
		flag4 = 0;
		switch (n)
		{
		case 1: book_liutong();
			break;
		case 2: exit_system();
			break;
		default: flag4 = 1;
		}
		if (flag4 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag4 != 0);
}
void book_return()
{
	char reader_name[100];
	char book_id[100];
	printf("请输入用户名:");
	scanf("%s", reader_name);
	printf("请输入书本号:");
	scanf("%s", book_id);
	struct Reader* head = NULL, * p;
	int flag1 = 1;
	p = temp_lian_reader(head);
	while (p)
	{
		if (strcmp(reader_name, p->name) == 0)
		{
			flag1 = 0;
			int flag2 = 1;
			struct Jilu* jhead = NULL, * jp = NULL, * jL = NULL;
			jp = jL = temp_lian_br(jhead);
			while (jp)
			{
				if (strcmp(reader_name, jp->reader_name) == 0 && strcmp(book_id, jp->book_id) == 0 && jp->return_data.year == 0)
				{
					flag2 = 0;
					break;
				}
				jp = jp->next;
			}
			if (flag2)
				printf("未找到此用户的记录!\n");
			else
			{
				struct Book* head = NULL, * p;
				p = temp_lian_book(head);
				int flag3 = 0;
				while (p)
				{
					if (strcmp(book_id, p->id) == 0)
					{
						flag3 = 1;
						struct Jilu* head = NULL, * p = NULL, * L = NULL;
						p = L = temp_lian_br(head);
						while (p)
						{
							if (strcmp(book_id, p->book_id) == 0 && p->return_data.year == 0)
							{
								struct Data nowtime = current_system_time();
								p->return_data.year = nowtime.year;
								p->return_data.month = nowtime.month;
								p->return_data.day = nowtime.day;
								break;
							}
							p = p->next;
						}
						int f;
						 
						f = write_br_data(L, br_data);
						
						if (f == 0)
							printf("写入失败!\n");
						else
							printf("写入成功!\n");
						struct Book* bhead = NULL, * bp, * bL;
						bp = bL = temp_lian_book(bhead);
						while (bp)
						{
							if (strcmp(book_id, bp->id) == 0)
								bp->borrow = bp->borrow - 1;
							bp = bp->next;
						}
						if (write_book_data(bL,book_data) == 0)
							printf("写入失败!\n");
						else
							printf("写入成功!\n");
						struct Reader* rhead = NULL, * rp, * rL;
						rp = rL = temp_lian_reader(rhead);
						while (rp)
						{
							if (strcmp(reader_name, rp->name) == 0)
								rp->been_borrow = rp->been_borrow - 1;
							rp = rp->next;
						}
						if (write_reader_data(rL,reader_data) == 0)
							printf("写入失败!\n");
						else
							printf("写入成功!\n");
					}
					p = p->next;
				}
				if (flag3 != 1)
					printf("未找到该书!\n");
			}
		}
		p = p->next;
	}
	if (flag1)
		printf("未找到该用户!\n");
	system("pause");
	int flag4;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n;
		scanf("%d", &n);
		flag4 = 0;
		switch (n)
		{
		case 1: book_liutong();
			break;
		case 2: exit_system();
			break;
		default: flag4 = 1;
		}
		if (flag4 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag4 != 0);
}
struct Jilu* temp_lian_br(struct Jilu* head)
{
	FILE* fp = fopen(br_data, "r");
	if (fp != NULL)
	{
		struct Jilu temp;
		struct Jilu* current = NULL, * prev = NULL;
		while (fscanf(fp, "%s %s %d-%d-%d %d-%d-%d", temp.reader_name, temp.book_id, &temp.borrow_data.year, &temp.borrow_data.month, &temp.borrow_data.day, &temp.return_data.year, &temp.return_data.month, &temp.return_data.day) != EOF)
		{
			current = (struct Jilu*)malloc(sizeof(struct Jilu));
			strcpy(current->reader_name, temp.reader_name);
			strcpy(current->book_id, temp.book_id);
			current->borrow_data.year = temp.borrow_data.year;
			current->borrow_data.month = temp.borrow_data.month;
			current->borrow_data.day = temp.borrow_data.day;
			current->return_data.year = temp.return_data.year;
			current->return_data.month = temp.return_data.month;
			current->return_data.day = temp.return_data.day;
			current->next = NULL;
			if (head == NULL)
				head = current;
			else
				prev->next = current;
			prev = current;
		}
	}
	return head;
}
struct Data current_system_time()
{
	struct Data temp;
	struct tm* ti;
	time_t t;
	time(&t);
	ti = localtime(&t);
	temp.year = ti->tm_year + 1900;
	temp.month = ti->tm_mon + 1;
	temp.day = ti->tm_mday;
	return temp;
}
int write_br_data(struct Jilu* head, const char* wenjian)
{
	FILE* fp = fopen(br_data, "w");
	struct Jilu* kill = head;
	if (fp == NULL)
		return 0;
	while (head)
	{
		fprintf(fp, "%s %s %d-%d-%d %d-%d-%d\n", head->reader_name, head->book_id, head->borrow_data.year, head->borrow_data.month, head->borrow_data.day, head->return_data.year, head->return_data.month, head->return_data.day);
		head = head->next;
	}
	free_br_data(kill);
	fclose(fp);
	return 1;
}
void free_br_data(struct Jilu* head)
{
	struct Jilu* freehead;
	while (head != NULL)
	{
		freehead = head;
		head = head->next;
		free(freehead);
	}
}
void book_number_found()
{
	struct Book* head = NULL, * p, * kill;
	char temp_id[100];
	int flag1 = 1;
	kill = p = temp_lian_book(head);
	printf("请输入书号:");
	scanf("%s", temp_id);
	while (p)
	{
		if (strcmp(temp_id, p->id) == 0)
		{
			flag1 = 0;
			printf("书本名称:");
			printf("%s\n", p->name);
			printf("书本作者:");
			printf("%s\n", p->author);
			printf("书本出版社:");
			printf("%s\n", p->press);
			printf("书本库存:");
			printf("%d\n", p->have);
			printf("已借出:");
			printf("%d\n", p->borrow);
			printf("相关检索信息:a, b, c");
			printf("%d %d %d\n", p->p1, p->p2, p->p3);
		}
		p = p->next;
	}
	if (flag1)
		printf("未找到该书!\n");
	system("pause");
	int flag2;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n;
		scanf("%d", &n);
		flag2 = 0;
		switch (n)
		{
		case 1: book_management();
			break;
		case 0: exit_system();
			break;
		default: flag2 = 1;
		}
		if (flag2 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag2 != 0);
}
void book_title_found()
{
	system("cls");
	char temp_name[100];
	int head, lengh;
	int flag1 = 0;
	printf("请输入你的书名:");
	scanf("%s", temp_name);
	struct Key* khead = NULL, * kp = NULL, * kkill;
	kkill = kp = temp_lian_key(khead, name_data);
	while (kp)
	{
		if (strcmp(temp_name, kp->keyword) == 0)
		{
			flag1 = 1;
			head = kp->head;
			lengh = kp->lengh;
			break;
		}
		kp = kp->next;
	}
	free_key_data(kkill);
	if (flag1 != 1)
		printf("未找到检索表,未找到该书名!\n");
	else
	{
		int count = 0;
		int flag2 = 0;
		struct Book* bhead = NULL, * bp = NULL, * bkill;
		bkill = bp = temp_lian_book(bhead);
		while (bp)
		{
			if (strcmp(temp_name, bp->name) == 0)
			{
				flag2 = 1;
				count++;
				printf("书本名称:");
				printf("%s\n", bp->name);
				printf("书本作者:");
				printf("%s\n", bp->author);
				printf("书本出版社:");
				printf("%s\n", bp->press);
				printf("书本库存:");
				printf("%d\n", bp->have);
				printf("已借出:");
				printf("%d\n", bp->borrow);
				printf("相关检索信息:a, b, c");
				printf("%d %d %d\n", bp->p1, bp->p2, bp->p3);
			}
			if (bp->num == head || count == lengh)
				break;
			bp = bp->next;
		}
		if (flag2)
			printf("未找到书!\n");
		free_book_data(bkill);
	}
	system("pause");
	int flag3;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n;
		scanf("%d", &n);
		flag3 = 0;
		switch (n)
		{
		case 1: book_management();
			break;
		case 0: exit_system();
			break;
		default: flag3 = 1;
		}
		if (flag3 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag3 != 0);
}
void book_author_found()
{
	system("cls");
	char temp_aut[100];
	int head, lengh;
	int flag1 = 0;
	printf("请输入作者:");
	scanf("%s", temp_aut);
	struct Key* khead = NULL, * kp = NULL, * kkill;
	kkill = kp = temp_lian_key(khead, author_data);
	
	while (kp)
	{
		if (strcmp(temp_aut, kp->keyword) == 0)
		{
			flag1 = 1;
			head = kp->head;
			lengh = kp->lengh;
			break;
		}
		kp = kp->next;
	}
	free_key_data(kkill);
	if (flag1 == 0)
		printf("未找到检索表,未找到该作者!\n");
	else
	{
		int count = 0;
		int flag2 = 0;
		struct Book* bhead = NULL, * bp = NULL, * bkill,*p;
		p =bkill = bp = temp_lian_book(bhead);
		while (bp)
		{
			if (strcmp(temp_aut, bp->author) == 0)
			{
				flag2 = 1;
				count++;
				printf("书本名称:");
				printf("%s\n", bp->name);
				printf("书本作者:");
				printf("%s\n", bp->author);
				printf("书本出版社:");
				printf("%s\n", bp->press);
				printf("书本库存:");
				printf("%d\n", bp->have);
				printf("已借出:");
				printf("%d\n", bp->borrow);
				printf("相关检索信息:a, b, c");
				printf("%d %d %d\n", bp->p1, bp->p2, bp->p3);
			}
			if (bp->num == head || count == lengh)
				break;
			bp = bp->next;
		}
		if (flag2 != 1)
			printf("未找到书!\n");
		free_book_data(bkill);
	}
	system("pause");
	int flag3;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n;
		scanf("%d", &n);
		flag3 = 0;
		switch (n)
		{
		case 1: book_management();
			break;
		case 0: exit_system();
			break;
		default: flag3 = 1;
		}
		if (flag3 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag3 != 0);
}
void book_press_found()
{
	system("cls");
	char temp_pre[100];
	int head = 0, lengh = 0;
	int flag1 = 0;
	printf("请输入出版社:");
	scanf("%s", temp_pre);
	struct Key* khead = NULL, * kp = NULL, * kkill;
	kkill = kp = temp_lian_key(khead, press_data);
	while (kp)
	{
		if (strcmp(temp_pre, kp->keyword) == 0)
		{
			flag1 = 1;
			head = kp->head;
			lengh = kp->lengh;
			break;
		}
		kp = kp->next;
	}
	free_key_data(kkill);
	if (flag1 != 1)
		printf("未找到检索表,未找到该出版社!\n");
	else
	{
		int count = 0;
		int flag2 = 0;
		struct Book* bhead = NULL, * bp = NULL, * bkill;
		bkill = bp = temp_lian_book(bhead);
		while (bp)
		{
			if (strcmp(temp_pre, bp->press) == 0)
			{
				flag2 = 1;
				count++;
				printf("书本名称:");
				printf("%s\n", bp->name);
				printf("书本作者:");
				printf("%s\n", bp->author);
				printf("书本出版社:");
				printf("%s\n", bp->press);
				printf("书本库存:");
				printf("%d\n", bp->have);
				printf("已借出:");
				printf("%d\n", bp->borrow);
				printf("相关检索信息:a, b, c");
				printf("%d %d %d\n", bp->p1, bp->p2, bp->p3);
			}
			if (bp->num == head || count == lengh)
				break;
			bp = bp->next;
		}
		if (flag2)
			printf("未找到书!\n");
		free_book_data(bkill);
	}
	system("pause");
	int flag3;
	do
	{
		system("cls");
		printf("1.返回上一级\n");
		printf("0.退出\n");
		printf("请输入对应编号:");
		int n;
		scanf("%d", &n);
		flag3 = 0;
		switch (n)
		{
		case 1: book_management();
			break;
		case 0: exit_system();
			break;
		default: flag3 = 1;
		}
		if (flag3 == 1)
		{
			printf("输入有误,请重新输入!\n");
			system("pause");
		}
	} while (flag3 != 0);
}
struct Key* temp_lian_key(struct Key* head, const char* wenjian)
{
	FILE* fp = fopen(wenjian, "r");
	if (fp != NULL)
	{
		struct Key temp;
		struct Key* current = NULL, * prev = NULL;
		int i = 0;
		while (fscanf(fp, "%s %d %d", temp.keyword, &temp.head, &temp.lengh) != EOF)
		{
			current = (struct Key*)malloc(sizeof(struct Key));
			strcpy(current->keyword, temp.keyword);
			current->head = temp.head;
			current->lengh = temp.lengh;
			current->next = NULL;
			if (NULL == head)
				head = current;
			else
				prev->next = current;
			prev = current;
		}
	}
	else
	{
		printf("文件打开失败!\n");
		exit_system();
	}
	return head;
}
void free_key_data(struct Key* head)
{
	struct Key* freehead;
	while (head != NULL)
	{
		freehead = head;
		head = head->next;
		free(freehead);
	}
}

 Book.txt

1 1021 数据库 杨艳 人民邮电 10 4 0 0 0
2 1014 数据结构 赵鹏 高等教育 9 7 0 0 0
3 1106 操作系统 金虎 人民邮电 8 6 2 0 0
4 1108 数据结构 高扬 清华大学 7 5 2 0 0
5 1203 程序设计 杨艳 高等教育 9 4 0 1 2
6 2105 数据库 金虎 清华大学 7 3 1 3 4
7 1012 数据结构 杨艳 人民邮电 8 2 4 5 3
8 0109 程序设计 赵鹏 清华大学 9 1 5 2 6

book_aut.txt

杨艳 7 3
赵鹏 8 2
金虎 6 2
高扬 4 1

book_name.txt

数据库 6 2
数据结构 7 3
操作系统 3 1
程序设计 8 2

book_pre.txt

人民邮电 7 3
高等教育 5 2
清华大学 8 3

Br.txt

1 1021 2021-6-23 2021-6-23
1 1021 2021-6-23 2021-6-23
1 1021 2021-6-23 2021-6-23
1 1021 2021-6-23 2021-6-23
1 1021 2021-6-23 2021-6-23
1 1021 2021-6-23 2021-6-23

Reader.txt

1 qq qq qq 10 0
2 w w w 10 0
3 q q q 10 0
4 re re re 10 0
5 sss sss sss 10 0
6 de de de 10 0
7 1 1 1 10 6
8 2 2 2 10 0

User.txt

gy gygy admin
ly lyly lib
lw lwlw reader
qwe qwe reader
ws wss reader
sss sss reader
de de reader
1 1 reader
2 2 reader

把以上文件做成后缀为txt的文件,并且全部放到 D盘的booksystem文件夹中,没有此文件夹请先建立。

   图书管理员:账号:ly,密码:lyly
   系统管理员:账号:  gy,  密码:  gygy
   读者:账号:lw,密码:lwlw

你可能感兴趣的:(c语言)