图书管理系统

最近刚上的一个项目--图书管理系统

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<vld.h>
#include<assert.h>
#include<windows.h>
#include<conio.h>

#define BOOK_NUM 200
#define READER_NUM 100
#define BOOK_DATA astBook[i].iNum,astBook[i].acName,astBook[i].acAuthor,astBook[i].acPress,astBook[i].iAmount
#define LEN_BOOK sizeof(struct Book)

#define READER_DATA astReader[i].iNum,astReader[i].acName,astReader[i].acSex,astReader[i].iMax,astReader[i].iAmount
#define LEN_READER sizeof(struct Reader)
//图书管理系统设计思路—图书(增删改查)—读者(增删改查)—借书还书
//图书信息:编号,名称,作者,出版社,出版时间(用结构体封装)
//读者信息:编号,姓名,性别,最大可借阅量,当前可借阅数量,已借阅图书列表

//两个结构体封装图书和读者的基本信息
struct Book
{
	int iNum;//图书编号
	char acName[15];//图书名称
	char acAuthor[15];//图书作者
	char acPress[15];//图书出版社
	int iAmount;//图书库存量
};

struct Reader
{
	int iNum;//读者编号
	char acName[15];//读者姓名
	char acSex[4];//读者性别
	int iMax;//读者最大可借阅数量
	int iAmount;//读者当前可借阅数量
	int BookId[10];//读者已经借阅图书列表
};

//定义两个全局结构体来记录所有图书信息和所有读者信息
struct Book astBook[BOOK_NUM];
struct Reader astReader[READER_NUM];

//显示主菜单
void ShowMainMeun()
{
	system("cls");//清屏函数
	printf("\n\n\n\n\n");
	printf("\t**********************************欢迎进入***********************************\n");
	printf("\t*******************************图书馆管理系统********************************\n");
	printf("\t*********************************主菜单**************************************\n");
	printf("\t*********************************1.图书管理**********************************\n");
	printf("\t*********************************2.读者管理**********************************\n");
	printf("\t*********************************3.借还书登记********************************\n");
	printf("\t*********************************0.退出系统**********************************\n");
	printf("\n");
	printf("\t\t请选择(0-3):");
}

//显示书籍管理的子菜单
void ShowBookMeun()
{
	system("cls");
	printf("\n\n\n\n");
	printf("\t|**********************************欢迎进入***********************************|\n");
	printf("\t|********************************图书管理系统*********************************|\n");
	printf("\t|***********************************子菜单************************************|\n");
	printf("\t|*******************************1.显示图书信息********************************|\n");
	printf("\t|*******************************2.增加图书信息********************************|\n");
	printf("\t|*******************************3.查找图书信息********************************|\n");
	printf("\t|*******************************4.修改图书信息********************************|\n");
	printf("\t|*******************************5.删除图书信息********************************|\n");
	printf("\t|*******************************0.返回主菜单**********************************|\n");
	printf("\n");
	printf("\t\t请选择(0-5):");
}

//读取图书文件
int ReadBookFile(const char* pcMode)
{
	int iBookRecord = 0;
	FILE* pfBook;//文件指针
	pfBook = fopen("book.txt", pcMode); //从文件中读到内存里
	if (pfBook == NULL)
	{
		return -1;
	}
	while (!feof(pfBook))
	{
		if (fread(&astBook[iBookRecord], LEN_BOOK, 1, pfBook))
		{
			iBookRecord++;
		}
	}
	fclose(pfBook);
	return iBookRecord;  //返回图书条数
}

// 显示图书信息
void ShowBook()
{
	int i, iBookRecord; //记录条数
	system("cls");
	iBookRecord = ReadBookFile("rb");//只读
	if (iBookRecord == -1)
	{
		printf("该文件打开失败,请先新增图书信息!\n");
	}
	if (iBookRecord == 0)
	{
		printf("文件中没有图书信息!\n");
	}
	else
	{
		printf("\t|**********************************************************************|\n");
		printf("\n\n");
		printf("\t%-10s%-16s%-10s%-20s%-4s\n", "编号", "书名", "作者", "出版社", "库存");//上边这些都是字符所以是%s
		for (i = 0; i < iBookRecord; i++)
		{
			printf("\t%-10d%-16s%-10s%-20s%-4d\n",BOOK_DATA);//图书数据中编号和数量都是数字所以是%d
		}
		printf("\n\n");
		printf("\t|**********************************************************************|\n");
		printf("\n\n");
	}
}

// 新增图书信息
void AddBook()
{
	FILE* pfBook;
	int iBookRecord, iFlagExist, i;
	char cFlag;
	system("cls");
	iBookRecord = ReadBookFile("ab+");//ab+追加方式打开或者新建二进制文件
	if (iBookRecord == -1)
	{
		printf("该文件打开失败!\n");
		return;
	}
	else if (iBookRecord == 0)
	{
		printf("没有图书记录!\n");
	}
	else
	{
		ShowBook();
	}
	//循环录入图书信息
	printf("请选择是否输入图书信息(y/n):");
	cFlag = getchar();
	getchar();
	if (cFlag == 'n')
	{
		return;
	}
	pfBook = fopen("book.txt", "ab+");
	if (pfBook == NULL)
	{
		printf("文件打开失败\n");
		return;
	}
	while (cFlag == 'y')
	{
		//录入数据
		if (iBookRecord >= BOOK_NUM)
		{
			printf("记录已满!");
			fclose(pfBook);
			return;
		}
		//图书编号不能重复
		printf("请输入图书编号:");
		do
		{
			iFlagExist = 0;
			scanf_s("%d", &astBook[iBookRecord].iNum);
			getchar();
			for (i = 0; i < iBookRecord; i++)
			{
				if (astBook[i].iNum == astBook[iBookRecord].iNum)
				{
					iFlagExist = 1;
					printf("该图书编号已经存在,请重新输入:");
					break;
				}	
			}
		} while (iFlagExist == 1);

		printf("请输入图书名称:");
		scanf("%s", astBook[iBookRecord].acName);
		getchar();

		printf("请输入图书作者:");
		scanf("%s", astBook[iBookRecord].acAuthor);
		getchar();

		printf("请输入图书出版社:");
		scanf("%s", astBook[iBookRecord].acPress);
		getchar();

		printf("请输入图书库存量:"); //数组的首元素就是地址符所以上边的那几个不用加取地址符,而库存量前边的结构体中写的不是数组,所以必须加上取地址符
		scanf("%d", &astBook[iBookRecord].iAmount);//一定要加取地址符
		getchar();

		//将新增的图书信息写入文件中
		if (fwrite(&astBook[iBookRecord],LEN_BOOK,1,pfBook) != 1)
		{
			printf("无法保存该信息!\n");
			return;
		}
		else
		{
			printf("%d号图书信息已经保存\n", astBook[iBookRecord].iNum);
			iBookRecord++;
		}
		printf("继续输入图书信息吗?(y/n)");
		cFlag = getchar();
		getchar();
	}
	fclose(pfBook);
	printf("添加图书信息执行完毕!\n");
}

//查找图书信息
int SearchBook()
{
	int iBookNum, iBookRecord, iBookId, i;//输入要查找的编号,记录条数,返回查找的图书编号,i后边循环需要用的
	system("cls");
	iBookRecord = ReadBookFile("rb");
	if (iBookRecord == -1)
	{
		printf("文件打开失败!\n");
		printf("|按任意键返回子菜单|");
		_getch();
		return -2;//文件打开失败,返回-2
	}
	else if (iBookRecord == 0)
	{
		printf("没有图书记录!\n");
		printf("|按任意键返回子菜单|");
		_getch();
		return -3; //没有记录,返回-3
	}
	//进入查找程序
	printf("请输入图书编号:");
	scanf("%d", &iBookNum);
	getchar();
	for (i = 0; i < iBookRecord; i++)
	{
		if (iBookNum == astBook[i].iNum)
		{
			iBookId = i;//找到记录,返回记录编号
			printf("%d号图书信息如下:\n", iBookNum);
			printf("\t-------------------------------------------------------------------------\n");
			printf("\n\n");
			printf("\t %-10s%-16s%-10s%-20s%-4s\n", "图书编号", "书名", "作者", "出版社", "库存量");
			printf("\t %-10d%-16s%-10s%-20s%-4d\n", BOOK_DATA); //注意编号和库存量都是数字所以是%d
			printf("\t-------------------------------------------------------------------------\n");
			break;
		}
	}
	if (i == iBookRecord)
	{
		printf("找不到%d号图书信息!\n", iBookNum);
		iBookId = -1;//找不到记录,返回-1;
	}
	return iBookId;
}

//显示修改选项的子菜单
void ShowModifyBookMenu()
{
	printf("\n\n\n");
	printf("\t                        1.图书编号                        \n");
	printf("\t                        2.图书书名                        \n");
	printf("\t                        3.图书作者                        \n");
	printf("\t                        4.图书出版社                      \n");
	printf("\t                        5.图书库存量                      \n");
	printf("\t         请输入所要修改的信息(输入相应的数字1-5):        ");
}

//保存图书函数
void SaveBookFile(int iBookId)
{
	FILE* pfBook;
	pfBook = fopen("book.txt","rb+");
	if (pfBook != NULL)
	{
		fseek(pfBook, LEN_BOOK * iBookId, SEEK_SET); //调准到需要修改的地方
		if (fwrite(&astBook[iBookId], LEN_BOOK, 1, pfBook) != 1)
		{
			printf("无法保存该信息!\n");
		}
	}

	fclose(pfBook);
}

//修改图书信息
void ModifyBook()
{
	int iBookId, iBookRecord, iFlagExist, iltem, iNum, i;
	system("cls");
	iBookId = SearchBook();
	if (iBookId == -1)
	{
		return;
	}
	if (iBookId == -3)
	{
		return;
	}
	//找到该序号的图书,可以进行修改
	iBookRecord = ReadBookFile("rb");
	//显示修改选项的子菜单
	ShowModifyBookMenu();
	scanf("%d", &iltem);
	getchar();

	switch (iltem)
	{
	case 1:
		printf("请输入图书编号:");
		do
		{
			iFlagExist = 0;
			scanf("%d", &iNum);
			getchar();
			for (i = 0; i < iBookRecord; i++)
			{
				if (iNum == astBook[i].iNum && i != iBookId)
				{
					iFlagExist = 1;
					printf("错误,该图书编号已经存在,请重新输入:");
					break;
				}
			}
		} while (iFlagExist == 1);
		astBook[iBookId].iNum = iNum;
		break;
	case 2:
		printf("请输入图书名称:");
		scanf("%s", astBook[iBookId].acName);
		getchar();
		break;
	case 3:
		printf("请输入图书作者:");
		scanf("%s", astBook[iBookId].acAuthor);
		getchar();
		break;
	case 4:
		printf("请输入图书出版社:");
		scanf("%s", astBook[iBookId].acPress);
		getchar();
		break;
	case 5:
		printf("请输入图书库存量:");
		scanf("%d", &astBook[iBookId].iAmount);
		getchar();
		break;
	}
	SaveBookFile(iBookId);
	printf("图书信息修改成功!\n");
}

//删除图书信息
void DeleteBook()
{
	FILE* pfBook;
	int iBookId, iBookRecord,  i;//返回删除的图书编号,记录条数,i后边循环需要用的
	char cFlag;

	system("cls");
	iBookId = SearchBook();
	if (iBookId == -1)
	{
		return;//文件打开失败
	}

	iBookRecord = ReadBookFile("rb");//??? 每一次操作都需要去内存里读数据,有没有好的办法替换它
	printf("已经找到该图书,是否删除?(y/n)");
	cFlag = getchar();
	getchar();

	//删除之前需要保存删除之前的图书编号,因为删除之后图书编号信息会被覆盖
	int index = astBook[iBookId].iNum;
	if (cFlag == 'n')
	{
		return;
	}
	else if (cFlag == 'y')
	{
		for (i = iBookId; i < iBookRecord-1; i++)
		{
			astBook[i] = astBook[i + 1];//数组依次往前挪
		}
		iBookRecord--;
	}

	pfBook = fopen("book.txt", "wb");
	if (pfBook != NULL)
	{
		for (i = 0; i < iBookRecord; i++)
		{
			if (fwrite(&astBook[i], LEN_BOOK, 1, pfBook) != 1)
			{
				printf("无法保存该信息!\n");
				return;
			}
		}
		fclose(pfBook);
		printf("%d号图书信息已删除!\n", index);
	}
}

//书籍管理
void ManageBook()
{
	int iltem;
	ShowBookMeun();//显示书籍管理的子菜单
	scanf_s("%d", &iltem);
	getchar();
	while (iltem)
	{
		switch (iltem)
		{
		case 1:
			ShowBook();//显示图书信息
			break;
		case 2:
			AddBook();//增加图书信息
			break;
		case 3:
			SearchBook();//查找图书信息
			break;
		case 4:
			ModifyBook();//修改图书信息
			break;
		case 5:
			DeleteBook();//删除图书信息
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t\t");
		}
		printf("|请按任意键返回子菜单|");
		_getch();//从控件中获取字符而无需回显;
		ShowBookMeun();
		scanf_s("%d", &iltem);
		getchar();
	}
}

//显示读者管理的子菜单
void ShowReaderMeun()
{
	system("cls");//清屏函数
	printf("\n\n\n\n");//目的是界面往中间一点
	printf("\t|**********************************欢迎进入***********************************|\n");
	printf("\t|********************************读者管理系统*********************************|\n");
	printf("\t|***********************************子菜单************************************|\n");
	printf("\t|*******************************1.显示读者信息********************************|\n");
	printf("\t|*******************************2.增加读者信息********************************|\n");
	printf("\t|*******************************3.查找读者信息********************************|\n");
	printf("\t|*******************************4.修改读者信息********************************|\n");
	printf("\t|*******************************5.删除读者信息********************************|\n");
	printf("\t|*******************************0.返回主菜单**********************************|\n");
	printf("\n");
	printf("\t\t请选择(0-5):");
}

//读取读者文件
int ReadReaderFile(const char* fopenpcMode)
{
	int iReaderRecord = 0;
	FILE* pfReader;//读者文件指针
	pfReader = fopen("reader.txt", fopenpcMode); //从文件中读到内存里
	if (pfReader == NULL)
	{
		return -1;
	}
	while (!feof(pfReader))
	{
		if (fread(&astReader[iReaderRecord], LEN_READER, 1, pfReader))
		{
			iReaderRecord++;
		}
	}
	fclose(pfReader);
	return iReaderRecord;  //返回读者条数
}

// 显示读者信息
void ShowReader()
{
	int i, iReaderRecord; //记录条数
	system("cls");
	iReaderRecord = ReadReaderFile("rb");//只读
	if (iReaderRecord == -1)
	{
		printf("该文件打开失败,请先新增读者信息!\n");
	}
	if (iReaderRecord == 0)
	{
		printf("文件中没有读者信息!\n");
	}
	else
	{
		printf("\t|****************************************************************************************|\n");
		printf("\n\n");
		printf("\t%-10s%-16s%-8s%-20s%-20s\n", "编号", "姓名", "性别", "最大可借阅数量", "当前可借阅数量");//上边这些都是字符所以是%s
		for (i = 0; i < iReaderRecord; i++)
		{
			printf("\t%-10d%-16s%-8s%-20d%-20d\n", READER_DATA);//读者数据中只有姓名和性别是字符型的其他都是整型的
		    //此处加宏定义是为了减少代码量
		}
		printf("\n\n");
		printf("\t|****************************************************************************************|\n");
		printf("\n\n");
	}
}

// 新增读者信息
void AddReader()
{
	FILE* pfReader;
	int iReaderRecord, iFlagExist, i;
	char cFlag;
	system("cls");
	iReaderRecord = ReadReaderFile("ab+");//ab+追加方式打开或者新建二进制文件
	if (iReaderRecord == -1)
	{
		printf("该文件打开失败!\n");
		return;
	}
	else if (iReaderRecord == 0)
	{
		printf("没有读者记录!\n");
	}
	else
	{
		ShowReader();
	}
	//循环录入图书信息
	printf("请选择是否输入读者信息(y/n):");
	cFlag = getchar();
	getchar();
	if (cFlag == 'n')
	{
		return;
	}
	pfReader = fopen("reader.txt", "ab+");
	if (pfReader == NULL)
	{
		printf("文件打开失败\n");
		return;
	}
	while (cFlag == 'y')
	{
		//录入数据
		if (iReaderRecord >= READER_NUM)
		{
			printf("记录已满!");
			fclose(pfReader);
			return;
		}
		//读者编号不能重复
		printf("请输入读者编号:");
		do
		{
			iFlagExist = 0;
			scanf_s("%d", &astReader[iReaderRecord].iNum);
			getchar();
			for (i = 0; i < iReaderRecord; i++)
			{
				if (astReader[i].iNum == astReader[iReaderRecord].iNum)
				{
					iFlagExist = 1;
					printf("该读者编号已经存在,请重新输入:");
					break;
				}
			}
		} while (iFlagExist == 1);

		printf("请输入读者姓名:");
		scanf("%s", astReader[iReaderRecord].acName);
		getchar();

		printf("请输入读者性别:");//F M  细节
		while (scanf("%s", astReader[iReaderRecord].acSex) > 0)
		{
			getchar();
			if (strcmp(astReader[iReaderRecord].acSex, "F") == 0 || strcmp(astReader[iReaderRecord].acSex, "M") == 0)
			{
				break;
			}
			printf("错误,只能输入'F'或者'M',请重新输入!\n");
		}

		printf("请输入读者最大可借阅数量(范围为5 - 10):");//10,范围
		scanf("%d", &astReader[iReaderRecord].iMax);//一定要加取地址符
		getchar();
		/*int iMax;
		while (scanf("%d", &iMax) == 1)
		{
			getchar();
			if (iMax >= 5 && iMax <= 10)
			{
				break;
			}
			printf("错误,请输入正确的最大可借阅的书的数量(范围为5 - 10):");
		}*/

		printf("请输入当前可借阅数量:"); //数组的首元素就是地址符所以上边的那几个不用加取地址符,而库存量前边的结构体中写的不是数组,所以必须加上取地址符
		//读者已借阅数量=iMax-iAmount
		scanf("%d", &astReader[iReaderRecord].iAmount);//一定要加取地址符
		getchar();

		//将新增的图书信息写入文件中
		if (fwrite(&astReader[iReaderRecord], LEN_READER, 1, pfReader) != 1)
		{
			printf("无法保存该信息!\n");
			return;
		}
		else
		{
			printf("%d号读者信息已经保存\n", astReader[iReaderRecord].iNum);
			iReaderRecord++;
		}
		printf("继续输入读者信息吗?(y/n)");
		cFlag = getchar();
		getchar();
	}
	fclose(pfReader);
	printf("添加读者信息执行完毕!\n");
}

//查找读者信息
int SearchReader()
{
	int iReaderNum, iReaderRecord, iReaderId, i;//输入要查找的编号,记录条数,返回查找的读者编号,i后边循环需要用的
	system("cls");
	iReaderRecord = ReadReaderFile("rb");//以"rb"形式打开文件,如果失败则返回
	if (iReaderRecord == -1)
	{
		printf("文件打开失败!\n");
		printf("|按任意键返回子菜单|");
		_getch();
		return -2;//文件打开失败,返回-2
	}
	else if (iReaderRecord == 0)
	{
		printf("没有读者记录!\n");
		printf("|按任意键返回子菜单|");
		_getch();
		return -3; //没有记录,返回-3
	}
	//进入查找程序
	printf("请输入读者编号:");
	scanf("%d", &iReaderNum);
	getchar();
	for (i = 0; i < iReaderRecord; i++)
	{
		if (iReaderNum == astReader[i].iNum)
		{
			iReaderId = i;//找到记录,返回记录编号
			printf("%d号读者信息如下:\n", iReaderNum);
			printf("\t-------------------------------------------------------------------------\n");
			printf("\n\n");
			printf("\t%-10s%-16s%-8s%-20s%-20s\n", "编号", "姓名", "性别", "最大可借阅数量", "当前可借阅数量");//上边这些都是字符所以是%s
			printf("\t%-10d%-16s%-8s%-20d%-20d\n", READER_DATA);//读者数据中只有姓名和性别是字符型的其他都是整型的
			printf("\t-------------------------------------------------------------------------\n");
			break;
		}
	}
	if (i == iReaderRecord)
	{
		printf("找不到%d号读者信息!\n", iReaderNum);
		iReaderId = -1;//找不到记录,返回-1;
	}
	return iReaderId;
}

//显示修改选项的子菜单
void ShowModifyReaderMenu()
{
	printf("\n\n\n");
	printf("\t                        1.读者编号                        \n");
	printf("\t                        2.读者姓名                        \n");
	printf("\t                        3.读者性别                        \n");
	printf("\t                        4.最大可借阅量数                  \n");
	printf("\t         请输入所要修改的信息(输入相应的数字1-4):         ");
}

//保存读者函数
void SaveReaderFile(int iReaderId)
{
	FILE* pfReader;
	pfReader = fopen("reader.txt", "rb+");
	if (pfReader != NULL)
	{
		fseek(pfReader, LEN_READER * iReaderId, SEEK_SET); //调整到需要修改的地方
		if (fwrite(&astReader[iReaderId], LEN_READER, 1, pfReader) != 1)
		{
			printf("无法保存该信息!\n");
		}
	}
	fclose(pfReader);
}

//修改读者信息
void ModifyReader()
{
	int iReaderId, iReaderRecord, iFlagExist, iBorrow, iltem, iNum, iMax, i;
	system("cls");
	iReaderId = SearchReader();
	if (iReaderId == -1)
	{
		return;
	}
	if (iReaderId == -3)
	{
		return;
	}
	//找到该序号的读者,可以进行修改
	iReaderRecord = ReadReaderFile("rb");
	//显示修改选项的子菜单
	ShowModifyReaderMenu();
	scanf("%d", &iltem);
	getchar();

	switch (iltem)
	{
	case 1:
		printf("请输入读者编号:");
		do
		{
			iFlagExist = 0;
			scanf("%d", &iNum);
			getchar();
			for (i = 0; i < iReaderRecord; i++)
			{
				if (iNum == astReader[i].iNum && i != iReaderId)
				{
					iFlagExist = 1;
					printf("错误,该读者编号已经存在,请重新输入:");
					break;
				}
			}
		} while (iFlagExist == 1);
		astReader[iReaderId].iNum = iNum;
		break;
	case 2:
		printf("请输入读者姓名:");
		scanf("%s", astReader[iReaderId].acName);
		getchar();
		break;
	case 3:
		printf("请输入读者性别:F/M");
		while (scanf("%s", astReader[iReaderId].acSex) > 0)
		{
			getchar();
			if (strcmp(astReader[iReaderId].acSex, "F") == 0 || strcmp(astReader[iReaderId].acSex, "M") == 0)
			{
				break;
			}
			printf("错误,只能输入'F'或者'M',请重新输入!\n");
		}
		break;
	case 4: //重点
		//iBorrow:已经借阅的数量
		iBorrow = astReader[iReaderId].iMax - astReader[iReaderId].iAmount;
		printf("请输入最大可借阅的数量(范围为5-10):\n");
		while (scanf("%d", &iMax) == 1)
		{
			getchar();
			if (iMax >= 5 && iMax <= 10)
			{
				if (iBorrow > iMax)
				{
					printf("该读者目前图书借阅数量大于最大图书借阅数量,需要先归还图书在修改!\n");
					return;
				}
				else
				{
					astReader[iReaderId].iMax = iMax;
					astReader[iReaderId].iAmount = iMax - iBorrow;
					for (i = iBorrow; i < iMax; i++)
					{
						astReader[iReaderId].BookId[i] = 0;
					}
					break;
				}
			}
			printf("错误,读者最大可借阅的书的范围为5-10,请重新输入:");
		}
		break;
	}
	SaveReaderFile(iReaderId);
	printf("该读者信息已修改成功!\n");
}

//删除读者信息
void DeleteReader()
{
	FILE* pfReader;//文件指针
	int iReaderId, iReaderRecord, i;//返回删除的读者编号,记录条数,i后边循环需要用的
	char cFlag;

	system("cls");
	iReaderId = SearchReader();
	if (iReaderId == -1)
	{
		return;//文件打开失败
	}

	iReaderRecord = ReadReaderFile("rb");//??? 每一次操作都需要去内存里读数据,有没有好的办法替换它
	printf("已经找到该读者,是否删除?(y/n)");
	cFlag = getchar();
	getchar();

	//删除之前需要保存删除之前的读者编号,因为删除之后图书编号信息会被覆盖
	int index = astReader[iReaderId].iNum;
	if (cFlag == 'n')
	{
		return;
	}
	else if (cFlag == 'y')
	{
		for (i = iReaderId; i < iReaderRecord - 1; i++)
		{
			astReader[i] = astReader[i + 1];//数组依次往前挪
		}
		iReaderRecord--;
	}

	pfReader = fopen("reader.txt", "wb");
	if (pfReader != NULL)
	{
		for (i = 0; i < iReaderRecord; i++)
		{
			if (fwrite(&astReader[i], LEN_READER, 1, pfReader) != 1)
			{
				printf("无法保存该信息!\n");
				return;
			}
		}
		fclose(pfReader);
		printf("%d号读者信息已删除!\n", index);
	}
}

//读者管理系统
void ManageReader()
{
	int rselect;
	ShowReaderMeun();//显示读者管理的子菜单
	scanf_s("%d", &rselect);
	getchar();
	while (rselect)
	{
		switch (rselect)
		{
		case 1:
			ShowReader();//显示读者信息
			break;
		case 2:
			AddReader();//增加读者信息
			break;
		case 3:
			SearchReader();//查找读者信息
			break;
		case 4:
			ModifyReader();//修改读者信息
			break;
		case 5:
			DeleteReader();//删除读者信息
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t\t");
		}
		printf("|请按任意键返回子菜单|");
		_getch();//从控件中获取字符而无需回显;
		ShowReaderMeun();
		scanf_s("%d", &rselect);
		getchar();
	}
}

//借还书子菜单
void ShowBorrowReturnMenu()
{
	system("cls");//清屏函数
	printf("\n\n\n\n");//目的是界面往中间一点
	printf("\t|**********************************欢迎进入***********************************|\n");
	printf("\t|*********************************借还书登记**********************************|\n");
	printf("\t|***********************************子菜单************************************|\n");
	printf("\t|*********************************1.借书登记**********************************|\n");
	printf("\t|*********************************2.还书登记**********************************|\n");
	printf("\t|*********************************0.返回主菜单********************************|\n");
	printf("\n");
	printf("\t\t请选择(0-2):");
}

//借书
void BorrowBook()
{
	//读者是否可以借书
	system("cls");
	int iBookId, iReaderId, iBorrow, i;
	//输入要借书的读者编号,判断编号是否存在,如果在,显示读者已经借阅的图书信息
	iReaderId = SearchReader();
	if (iReaderId == -1)
	{
		return;
	}
	iBorrow = astReader[iReaderId].iMax - astReader[iReaderId].iAmount;
	if (iBorrow == 0)
	{
		printf("该读者目前没有借阅任何图书!");
	}
	else
	{
		printf("\t该读者当前所借阅图书为:");
		for (i = 0; i < iBorrow; i++)
		{
			printf("%d ", astReader[iReaderId].BookId[i]);
		}
		printf("\n\n");
	}

	if (astReader[iReaderId].iAmount == 0)
	{
		printf("该读者可借阅的图书数量为0,不能继续借书!\n");
	}

	//图书是否可借阅
	printf("\n按任意键输入要借阅的图书信息\n");
	_getch();
	iBookId = SearchBook();
	if (iBookId == -1)
	{
		return;
	}
	if (astBook[iBookId].iAmount == 0)
	{
		printf("该图书库存量为0!图书不可借阅!\n");
		return;
	}
	//借书
	astReader[iReaderId].BookId[iBorrow] = astBook[iBookId].iNum;
	//图书的库存-1
	astBook[iBookId].iAmount--;
	//当前读者的可借书的数量-1
	astReader[iReaderId].iAmount--;

	SaveBookFile(iBookId);
	SaveReaderFile(iReaderId);

	printf("借书成功!\n");
}

//还书
void ReturnBook()
{
	//读者是否可以还书
	system("cls");
	int iBookId, iReaderId, iBorrow, i,j;
	//1.读者在不在	
	iReaderId = SearchReader();
	if (iReaderId == -1)
	{
		return;
	}
	iBorrow = astReader[iReaderId].iMax - astReader[iReaderId].iAmount;
	if (iBorrow == 0)
	{
		printf("该读者目前没有借阅任何图书,无需归还!");
		return;
	}
	else
	{
		printf("\t该读者当前所借阅图书为:");
		for (i = 0; i < iBorrow; i++)
		{
			printf("%d ", astReader[iReaderId].BookId[i]);
		}
	}
	printf("按任意键输入要归还的图书信息\n");
	_getch();

	// 2.图书在不在
	iBookId = SearchBook();
	if (iBookId == -1)
	{
		return;
	}
	//3.借书列表里有没有这本书
	for (i = 0; i < iBorrow; i++)
	{
		if (astReader[iReaderId].BookId[i] == astBook[iBookId].iNum)
		{
			//还书
			for (j = i; j < iBorrow - 1; j++)
			{
				astReader[iReaderId].BookId[j] = astReader[iReaderId].BookId[j + 1];
			}
			astReader[iReaderId].BookId[iBorrow - 1] = 0;
			//图书的库存+1
			astBook[iBookId].iAmount++;
			//当前读者的可借书的数量+1
			astReader[iReaderId].iAmount++;
			break;
		}
	}
	if (i == iBorrow)
	{
		printf("该读者没有借阅这本书,无需归还!\n");
		return;
	}

	SaveBookFile(iBookId);
	SaveReaderFile(iReaderId);

	printf("还书成功!\n");
}

//借还书模块
void BorrowReturnManage()
{
	ShowBorrowReturnMenu();
	int iltem;
	scanf_s("%d", &iltem);
	getchar();
	while (iltem)
	{
		switch (iltem)
		{
		case 1:
			BorrowBook();//借书
			break;
		case 2:
			ReturnBook();//还书
			break;
		default:
			printf("\t\t请输入正确的数字!\n");
		}
		printf("|请按任意键返回子菜单|");
		_getch();//从控件中获取字符而无需回显;
		ShowBorrowReturnMenu();
		scanf_s("%d", &iltem);
		getchar();
	}
}


int main()
{
	//显示主函数的界面
	ShowMainMeun();
	int iltem;
	scanf_s("%d", &iltem);
	while (iltem)
	{
		switch (iltem)
		{
		case 1:
			ManageBook();//图书管理模块
			break;
		case 2:
			ManageReader();//读者管理模块
			break;
		case 3:
			BorrowReturnManage();//借还书模块
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t程序将于3秒后跳转到主菜单");
			Sleep(3000);
		}
		ShowMainMeun();
		scanf_s("%d", &iltem);
		getchar();
	}
	return 0;
}

代码调试结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值