IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 图书馆管理系统(附源码及操作视频动图演示) -> 正文阅读

[C++知识库]图书馆管理系统(附源码及操作视频动图演示)

功能框架图:

整体源码在文章最后,这个系统搭架定义了一些全局变量,且系统功能都要调用文件函数,效率低下,优化可根据自行改为使用线性表,数据库等,此代码适用纯C语言阶段学习

总体框架的搭建:

#include<stdio.h>
#include<windows.h>
#include<conio.h>

#define BOOK_NUM 200
#define READER_NUM 200

#define BOOK_DATA astBook[i].iNum,astBook[i].acName,astBook[i].acAuthor,astBook[i].acPress,astBook[i].iAmount
#define READER_DATA astReader[i].iNum,astReader[i].acName,astReader[i].acSex,astReader[i].iMax,astReader[i].iAmount
//定义别名方便后续文件操作写入信息

#define LEN_BOOK sizeof(struct Book) //结构体大小
#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 Bookld[10];//读者已经借阅的图书
};
//定义两个全局结构体数组来记录所有图书信息和所有读者信息
struct Book astBook[BOOK_NUM];
struct Reader astReader[READER_NUM];

//显示主菜单
void Meau()
{
	//清屏函数
	system("cls");

	printf("\n\n");
	printf("——————————————————————————\n");
	printf("********************欢迎进入图书馆******************\n");
	printf("********************图书馆管理系统******************\n");
	printf("************************主菜单**********************\n");
	printf("*********************1.图书管理*********************\n");
	printf("*********************2.读者管理*********************\n");
	printf("*********************3.登记借还书*******************\n");
	printf("*********************0.退出系统*********************\n");
	printf("——————————————————————————");
	printf("\n");
	printf("请选择(0-3)");
}

//中间是三大板块的实现-------


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

图书管理实现:

设置图书管理选项子菜单,保存图书信息文件函数,进行增删改查

void ShowBookMenu()//显示书籍管理子菜单
{
	//清屏函数
	system("cls");
	printf("\n\n");
	printf("—————————————————————————————\n");
	printf("|********************欢迎进入图书馆**********************|\n");
	printf("|********************图书馆管理系统**********************|\n");
	printf("|**********************图书子菜单************************|\n");
	printf("|********************1.显示图书信息**********************|\n");
	printf("|********************2.新增图书信息**********************|\n");
	printf("|********************3.查找图书信息**********************|\n");
	printf("|********************4.删除图书信息**********************|\n");
	printf("|********************5.修改图书信息**********************|\n");
	printf("|********************0.返回主菜单************************|\n");
	printf("—————————————————————————————");
	printf("\n");
	printf("请选择(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("\n\n");
		printf("—————————————————————————————————\n");
		printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "书名", "作者", "出版社", "库存");
		for (i = 0; i < iBookRecord; i++)
		{
			printf("%-10d%-16s%-16s%-18s%-6d\n",BOOK_DATA);
			printf("—————————————————————————————————\n");
		}
		printf("\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("%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, iBookld, 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)
		{
			iBookld = i;//找到记录,返回记录编号
			printf("%d号图书信息如下:\n", iBookNum);
			printf("—————————————————————————————————\n");
			printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "书名", "作者", "出版社", "库存");
			printf("%-10d%-16s%-16s%-18s%-6d\n", BOOK_DATA);
			printf("—————————————————————————————————\n");
			break;
		}
	}
	if (i == iBookRecord)
	{
		printf("未找到%d号图书信息!\n", iBookNum);
		iBookld = -1; //找不到返回-1
	}
	return iBookld;
}
void DeleteBook()//删除图书信息
{
	FILE* pfBook;
	int iBookld, iBookRecord, i;
	char cFlag;
	system("cls");
	iBookld = SearchBook();
	if (iBookld == -1)
	{
		return;
	}
	if (iBookld == -2)
	{
		printf("文件打开失败!\n");
		return;
	}
	if (iBookld == -3)
	{
		printf("未查到该记录!\n");
		return;
	}
	iBookRecord = ReadBookFile("rb");
	printf("已经找到该图书信息,是否删除(y/n)");
	cFlag = getchar();
	getchar();
	//删除之前保存删除之前的图书编号,输出之后编号信息会被覆盖
	int index = astBook[iBookld].iNum;
	if (cFlag == 'n')
	{
		return;
	}
	else if (cFlag == 'y')
	{
		for (i = iBookld; 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 ShowModifyBookMenu()
{
	printf("\n\n");
	printf("——————————————————————————\n");
	printf("********************1.编号**************************\n");
	printf("********************2.书名**************************\n");
	printf("********************3.作者**************************\n");
	printf("********************4.出版社************************\n");
	printf("********************5.图书库存量********************\n");
	printf("——————————————————————————\n");
	printf("请输入所要修改的信息,请选择(1-5):");
}
//保存修改后图书信息
void SaveBookFile(int iBookld)
{
	FILE* pfBook;
	pfBook = fopen("book.txt", "rb+");
	if (pfBook != NULL)
	{
		fseek(pfBook, LEN_BOOK * iBookld, SEEK_SET);
		if (fwrite(&astBook[iBookld], LEN_BOOK, 1, pfBook) != 1)
		{
			printf("无法保存该信息!\n");
		}
	}
	fclose(pfBook);
}
void ModifyBook()//修改图书信息
{
	int iBookld, iBookRecord, iFlagExist, iltem, iNum, i;//查找到的书籍id,记录条数,标记是否重复,输入选择,修改的编号
	system("cls");
	iBookld = SearchBook();
	if (iBookld== -1)
	{
		return;
	}
	if (iBookld == -2)
	{
		printf("文件打开失败!\n");
		return;
	}
	if (iBookld == -3)
	{
		printf("未查到该记录!\n");
		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 != iBookld)
				{
					iFlagExist = 1;
					printf("错误,该图书编号已存在,请重新输入:");
					break;
				}
			}
		} while (iFlagExist == 1);
		astBook[iBookld].iNum = iNum;
		break;
	case 2:
		printf("请输入图书名称:");
		scanf("%s", astBook[iBookld].acName);
		getchar();
		break;
	case 3:
		printf("请输入图书作者:");
		scanf("%s", astBook[iBookld].acAuthor);
		getchar();
		break;
	case 4:
		printf("请输入图书出版社:");
		scanf("%s", astBook[iBookld].acPress);
		getchar();
		break;
	case 5:
		printf("请输入图书库存量:");
		scanf("%d", &astBook[iBookld].iAmount);
		getchar();
		break;
	}
	SaveBookFile(iBookld);
	printf("图书信息修改成功!\n");
}
void ManageBook()//书籍管理
{
	int iltem;
	ShowBookMenu();//显示书籍管理子菜单
	scanf("%d", &iltem);
	getchar();
	while (iltem)
	{
		switch (iltem)
		{
		case 1:
			ShowBook();//显示图书信息
			break;
		case 2:
			AddBook();//新增图书信息
			break;

		case 3:
			SearchBook();//查找图书信息
			break;

		case 4:
			DeleteBook();//删除图书信息
			break;
		case 5:
			ModifyBook();//修改图书信息
			break;
		default:
			printf("请输入正确的选项!");
		}
		printf("请按任意键返回子菜单*_*");
		_getch();//从控件中获取字符而无需回响
		ShowBookMenu();//显示书籍管理子菜单
		scanf("%d", &iltem);
		getchar();
	}
}

读者管理实现与图书基本一致:照猫画虎即可

重点在与读者信息的修改,存在读者最大可借阅图书数量和当前可借阅图书数量,若改变其中一个信息,另一个相应要做出改变

void ShowReaderMenu()//显示读者管理子菜单
{
	//清屏函数
	system("cls");
	printf("\n\n");
	printf("—————————————————————————————\n");
	printf("|********************欢迎进入图书馆**********************|\n");
	printf("|********************图书馆管理系统**********************|\n");
	printf("|********************* 读者子菜单************************|\n");
	printf("|********************1.显示读者信息**********************|\n");
	printf("|********************2.新增读者信息**********************|\n");
	printf("|********************3.查找读者信息**********************|\n");
	printf("|********************4.删除读者信息**********************|\n");
	printf("|********************5.修改读者信息**********************|\n");
	printf("|********************0.返回主菜单************************|\n");
	printf("—————————————————————————————");
	printf("\n");
	printf("请选择(0-5)");
}
int ReadReaderFile(const char* pcMode)//读取读者信息文件
{
	int iReaderRecord = 0;
	FILE* pfReader; //文件指针
	pfReader = fopen("reader.txt", pcMode);
	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("\n\n");
		printf("—————————————————————————————————————\n");
		printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "姓名", "性别", "最大可借书数量", "当前可借书数量");
		for (i = 0; i < iReaderRecord; i++)
		{
			printf("%-10d%-16s%-16s%-18d%-6d\n", READER_DATA);
			printf("—————————————————————————————————————\n");
		}
		printf("\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("%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("请输入读者性别:男or女:");
		scanf("%s", astReader[iReaderRecord].acSex);
		getchar();
		int sex = 1;//标志
		while (sex)
		{
			if (strcmp(astReader[iReaderRecord].acSex, "男") == 0 || strcmp(astReader[iReaderRecord].acSex, "女") == 0)
			{
				sex = 0;
				break;
			}
			else
			{
				sex = 1;
				printf("读者性别输入错误,请重新输入:");
				scanf("%s", astReader[iReaderRecord].acSex);
			}
		}
		//读者最大可阅读数量
		printf("请输入读者最大可阅读数量:");//10,范围
		scanf("%d", &astReader[iReaderRecord].iMax);
		getchar();
		//读者当前可借阅的数量
		printf("请输入读者当前可借阅的数量:");//新增的读者10,提示,两者必须相等
		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, iReaderld, i;//要查找的编号,记录条数,记录编号,循环
	system("cls");
	iReaderRecord = ReadReaderFile("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)
		{
			iReaderld = i;//找到记录,返回记录编号
			printf("%d号读者信息如下:\n", iReaderNum);
			printf("—————————————————————————————————————\n");
			printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "姓名", "性别", "最大可借书数量", "当前可借书数量");
			printf("%-10d%-16s%-16s%-18d%-6d\n", READER_DATA);
			printf("—————————————————————————————————————\n");
			break;
		}
	}
	if (i == iReaderRecord)
	{
		printf("未找到%d号读者信息!\n", iReaderNum);
		iReaderld = -1; //找不到返回-1
	}
	return iReaderld;
}


void DeleteReader()//删除读者信息
{
	FILE* pfReader;//文件指针
	int iReaderId, iReaderRecord, 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;//index保存删除之前的读者编号,因为删除
	//之后新的读者编号就会覆盖掉原来的读者编号
	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 ShowModifyReaderMenu()//显示修改的选项
{
	printf("\n\n");
	printf("——————————————————————————\n");
	printf("********************1.编号**************************\n");
	printf("********************2.姓名**************************\n");
	printf("********************3.性别**************************\n");
	printf("********************4.最大可阅读数量****************\n");
	printf("——————————————————————————\n");
	printf("请输入所要修改的信息,请选择(1-4):");
}
//保存修改后读者信息
void SaveReaderFile(int iReaderld)
{
	FILE* pfReader;
	pfReader = fopen("reader.txt", "rb+");
	if (pfReader != NULL)
	{
		fseek(pfReader, LEN_READER * iReaderld, SEEK_SET);
		if (fwrite(&astReader[iReaderld], LEN_READER, 1, pfReader) != 1)
		{
			printf("无法保存该信息!\n");
		}
	}
	fclose(pfReader);
}
void  ModifyReader()//修改读者信息
{
	int   iReaderld, iReaderRecord, iBorrow, iItem, iNum, iMax, iFlagExist, i;
	system(" cls");
	iReaderld = SearchReader();
	if (iReaderld == -1)
	{
		return;
	}
	//找到该序号的读者,可以进行修改

	iReaderRecord = ReadReaderFile("rb");
	ShowModifyReaderMenu();//显示修改的选项
	scanf("%d", &iItem);
	getchar();

	switch (iItem)
	{
	case 1:
		printf("请输入读者编号:");
		do
		{
			iFlagExist = 0;
			scanf("%d", &iNum);
			getchar();
			for (i = 0; i < iReaderRecord; i++)
			{
				if (iNum == astReader[i].iNum && i != iReaderld)
				{
					iFlagExist = 1;
					printf("错误,该读者编号已经存在,请重新输入:");
					break;
				}
			}
		} while (iFlagExist == 1);
		astReader[iReaderld].iNum = iNum;
		break;
	case 2:
		printf("请输入读者姓名:");
		scanf("%s", astReader[iReaderld].acName);
		getchar();
		break;
	case 3:
		printf("请输入读者性别:男/女:");
		while (scanf("%s", astReader[iReaderld].acSex) > 0)
		{
			getchar();
			if (strcmp(astReader[iReaderld].acSex, "男") == 0 || strcmp(astReader[iReaderld].acSex, "女") == 0)
			{
				break;
			}
			printf("错误,只能输入“男”或者“女”,请重新输入:\n");
		}
		break;
	case 4:
		//iBorrow:已经借阅的数量
		iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
		printf("请输入读者最大可借阅的数量(范围为5-10):\n");
		while (scanf("%d", &iMax) == 1)
		{
			getchar();
			if (iMax >= 5 && iMax <= 10)
			{
				if (iBorrow > iMax)
				{
					printf("先还书!\n");
					return;
				}
				else
				{
					astReader[iReaderld].iMax = iMax;
					astReader[iReaderld].iAmount = iMax - iBorrow;
					for (i = iBorrow; i < iMax; i++)
					{
						astReader[iReaderld].Bookld[i] = 0;
					}
					break;
				}
			}
			printf("错误,读者最大可借阅的书的范围为5-10,请重新输入:\n");
		}
		break;
	}
	SaveReaderFile(iReaderld);
	printf("该读者信息已经修改成功!\n");
}
void ManageReader()//读者管理模块
{
	int rselect; //选择
	ShowReaderMenu();//显示读者管理的子菜单
	scanf("%d", &rselect);
	getchar();
	while (rselect)
	{
		switch (rselect)
		{
		case 1:
			ShowReader();//显示读者信息
			break;
		case 2:
			AddReader();//新增读者信息
			break;
		case 3:
			SearchReader();//查找读者信息
			break;
		case 4:
			DeleteReader();//删除读者信息
			break;
		case 5:
			ModifyReader();//修改读者信息
			break;
		defalut:
				printf("请输入正确的选项!");
		}
		printf("请按任意键返回子菜单*_*");
		_getch();//从控件中获取字符而无需回响
		ShowReaderMenu();//显示读者管理子菜单
		scanf("%d", &rselect);
		getchar();
	}
}

借书还书的登记板块实现:

void showBorrowReturnMenu()//借还书子菜单
{
	system("cls");
	printf("\n\n");
	printf("—————————————————————————————\n");
	printf("|********************欢迎进入图书馆**********************|\n");
	printf("|********************图书馆管理系统**********************|\n");
	printf("|*********************借还书子菜单***********************|\n");
	printf("|*********************1.借书登记*************************|\n");
	printf("|*********************2.还书登记*************************|\n");
	printf("|*********************0.返回主菜单***********************|\n");
	printf("—————————————————————————————");
	printf("\n");
	printf("请选择(0-2)");
}
void BorrowBook()//借书
{
	//读者是否有资格借书
	system("cls");
	int iBookld, iReaderld, iBorrow, i;
	//输入要借书的读者编号判断编号是否存在,若存在,显示读者已经借阅的图书信息
	iReaderld = SearchReader();
	if (iReaderld==-1)
	{
		return;
	}
	iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
	if (iBorrow == 0)
	{
		printf("该读者目前没有借阅任何书!");
	}
	else
	{
		printf("该读者当前所借图书为:");
		for (i = 0; i < iBorrow; i++)
		{
			printf("%d ", astReader[iReaderld].Bookld[i]);
		}
	}
	if (astReader[iReaderld].iAmount == 0)
	{
		printf("读者可以借书数量为0,不能继续借书!\n");
	}
	//书籍是否可以被借阅(书籍是否存在,库存是否还有,借书后读者最大可借阅书籍减少)
	printf("\n请按任意键输入要借阅的图书信息*_*\n");
	_getch();
	iBookld = SearchBook();
	if (iBookld == -1)
	{
		return;
	}
	if (astBook[iBookld].iAmount == 0)
	{
		printf("该图书库存为0,图书不可借阅!\n");
		return;
	}
	//借书操作
	astReader[iReaderld].Bookld[iBorrow] = astBook[iBookld].iNum;
	//图书的库存减一
	astBook[iBookld].iAmount--;
	//当前可借阅的书的数量减一
	astReader[iReaderld].iAmount--;

	SaveBookFile(iBookld);
	SaveReaderFile(iReaderld);
	printf("借书成功!\n");
}
void ReturnBook()//还书
{
	system("cls");
	int iBookld, iReaderld, iBorrow, i, j;
	//读者
	iReaderld = SearchReader();
	if (iReaderld == -1)
	{
		return;
	}
	iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
	if (iBorrow == 0)
	{
		printf("该读者未借阅任何书,无需归还\n");
		return;
	}
	else
	{
		printf("\n该读者当前借阅的图书为:");
		for (i = 0; i < iBorrow; i++)
		{
			printf("%d ", astReader[iReaderld].Bookld[i]);
		}
	}
	printf("\n按任意键输入要归还的图书信息\n");
	_getch();
	//图书在不在
	iBookld = SearchBook();
	if (iBookld == -1)
		return;
	//借书列表里有没有这本书
	for (i = 0; i < iBorrow; i++)
	{
		if (astReader[iReaderld].Bookld[i] == astBook[iBookld].iNum)
		{
			//还书
			for (j = i; j < iBorrow-1; j++)
			{
				astReader[iReaderld].Bookld[j] = astReader[iReaderld].Bookld[j + 1];
			}
			astReader[iReaderld].Bookld[iBorrow - 1] = 0;
			//图书库存加一
			astBook[iBookld].iAmount++;
			//读者的可借书的数量+1
			astReader[iReaderld].iAmount++;
			break;
		}
	}
	if (i == iBorrow)
	{
		printf("该读者未借阅这本书,无需归还");
		return;
	}
	SaveBookFile(iBookld);
	SaveReaderFile(iReaderld);
	printf("还书成功!\n");
}
void ManageBorrowReturn()//借还书管理模块
{
	showBorrowReturnMenu();//借还书的子菜单
	int iltem;
	scanf("%d", &iltem);
	getchar();
	while (iltem)
	{
		switch (iltem)
		{
		case 1:
			BorrowBook();//借书
			break;
		case 2:
			ReturnBook();//还书
			break;
		default:
			printf("请输入正确的选项!\n");
		}
		printf("请按任意键返回子菜单*_*");
		_getch();//从控件中获取字符而无需回响
		showBorrowReturnMenu();//显示借还书管理子菜单
		scanf("%d", &iltem);
		getchar();
	}
}

操作演示:

?完整代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<conio.h>

#define BOOK_NUM 200
#define READER_NUM 200

#define BOOK_DATA astBook[i].iNum,astBook[i].acName,astBook[i].acAuthor,astBook[i].acPress,astBook[i].iAmount
#define READER_DATA astReader[i].iNum,astReader[i].acName,astReader[i].acSex,astReader[i].iMax,astReader[i].iAmount

#define LEN_BOOK sizeof(struct Book) //结构体大小
#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 Bookld[10];//读者已经借阅的图书
};
//定义两个全局结构体数组来记录所有图书信息和所有读者信息
struct Book astBook[BOOK_NUM];
struct Reader astReader[READER_NUM];
//显示主菜单
void Meau()
{
	//清屏函数
	system("cls");

	printf("\n\n");
	printf("——————————————————————————\n");
	printf("********************欢迎进入图书馆******************\n");
	printf("********************图书馆管理系统******************\n");
	printf("************************主菜单**********************\n");
	printf("*********************1.图书管理*********************\n");
	printf("*********************2.读者管理*********************\n");
	printf("*********************3.登记借还书*******************\n");
	printf("*********************0.退出系统*********************\n");
	printf("——————————————————————————");
	printf("\n");
	printf("请选择(0-3)");
}
void ShowBookMenu()//显示书籍管理子菜单
{
	//清屏函数
	system("cls");
	printf("\n\n");
	printf("—————————————————————————————\n");
	printf("|********************欢迎进入图书馆**********************|\n");
	printf("|********************图书馆管理系统**********************|\n");
	printf("|**********************图书子菜单************************|\n");
	printf("|********************1.显示图书信息**********************|\n");
	printf("|********************2.新增图书信息**********************|\n");
	printf("|********************3.查找图书信息**********************|\n");
	printf("|********************4.删除图书信息**********************|\n");
	printf("|********************5.修改图书信息**********************|\n");
	printf("|********************0.返回主菜单************************|\n");
	printf("—————————————————————————————");
	printf("\n");
	printf("请选择(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("\n\n");
		printf("—————————————————————————————————\n");
		printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "书名", "作者", "出版社", "库存");
		for (i = 0; i < iBookRecord; i++)
		{
			printf("%-10d%-16s%-16s%-18s%-6d\n",BOOK_DATA);
			printf("—————————————————————————————————\n");
		}
		printf("\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("%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, iBookld, 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)
		{
			iBookld = i;//找到记录,返回记录编号
			printf("%d号图书信息如下:\n", iBookNum);
			printf("—————————————————————————————————\n");
			printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "书名", "作者", "出版社", "库存");
			printf("%-10d%-16s%-16s%-18s%-6d\n", BOOK_DATA);
			printf("—————————————————————————————————\n");
			break;
		}
	}
	if (i == iBookRecord)
	{
		printf("未找到%d号图书信息!\n", iBookNum);
		iBookld = -1; //找不到返回-1
	}
	return iBookld;
}
void DeleteBook()//删除图书信息
{
	FILE* pfBook;
	int iBookld, iBookRecord, i;
	char cFlag;
	system("cls");
	iBookld = SearchBook();
	if (iBookld == -1)
	{
		return;
	}
	if (iBookld == -2)
	{
		printf("文件打开失败!\n");
		return;
	}
	if (iBookld == -3)
	{
		printf("未查到该记录!\n");
		return;
	}
	iBookRecord = ReadBookFile("rb");
	printf("已经找到该图书信息,是否删除(y/n)");
	cFlag = getchar();
	getchar();
	//删除之前保存删除之前的图书编号,输出之后编号信息会被覆盖
	int index = astBook[iBookld].iNum;
	if (cFlag == 'n')
	{
		return;
	}
	else if (cFlag == 'y')
	{
		for (i = iBookld; 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 ShowModifyBookMenu()
{
	printf("\n\n");
	printf("——————————————————————————\n");
	printf("********************1.编号**************************\n");
	printf("********************2.书名**************************\n");
	printf("********************3.作者**************************\n");
	printf("********************4.出版社************************\n");
	printf("********************5.图书库存量********************\n");
	printf("——————————————————————————\n");
	printf("请输入所要修改的信息,请选择(1-5):");
}
//保存修改后图书信息
void SaveBookFile(int iBookld)
{
	FILE* pfBook;
	pfBook = fopen("book.txt", "rb+");
	if (pfBook != NULL)
	{
		fseek(pfBook, LEN_BOOK * iBookld, SEEK_SET);
		if (fwrite(&astBook[iBookld], LEN_BOOK, 1, pfBook) != 1)
		{
			printf("无法保存该信息!\n");
		}
	}
	fclose(pfBook);
}
void ModifyBook()//修改图书信息
{
	int iBookld, iBookRecord, iFlagExist, iltem, iNum, i;//查找到的书籍id,记录条数,标记是否重复,输入选择,修改的编号
	system("cls");
	iBookld = SearchBook();
	if (iBookld== -1)
	{
		return;
	}
	if (iBookld == -2)
	{
		printf("文件打开失败!\n");
		return;
	}
	if (iBookld == -3)
	{
		printf("未查到该记录!\n");
		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 != iBookld)
				{
					iFlagExist = 1;
					printf("错误,该图书编号已存在,请重新输入:");
					break;
				}
			}
		} while (iFlagExist == 1);
		astBook[iBookld].iNum = iNum;
		break;
	case 2:
		printf("请输入图书名称:");
		scanf("%s", astBook[iBookld].acName);
		getchar();
		break;
	case 3:
		printf("请输入图书作者:");
		scanf("%s", astBook[iBookld].acAuthor);
		getchar();
		break;
	case 4:
		printf("请输入图书出版社:");
		scanf("%s", astBook[iBookld].acPress);
		getchar();
		break;
	case 5:
		printf("请输入图书库存量:");
		scanf("%d", &astBook[iBookld].iAmount);
		getchar();
		break;
	}
	SaveBookFile(iBookld);
	printf("图书信息修改成功!\n");
}
void ManageBook()//书籍管理
{
	int iltem;
	ShowBookMenu();//显示书籍管理子菜单
	scanf("%d", &iltem);
	getchar();
	while (iltem)
	{
		switch (iltem)
		{
		case 1:
			ShowBook();//显示图书信息
			break;
		case 2:
			AddBook();//新增图书信息
			break;

		case 3:
			SearchBook();//查找图书信息
			break;

		case 4:
			DeleteBook();//删除图书信息
			break;
		case 5:
			ModifyBook();//修改图书信息
			break;
		default:
			printf("请输入正确的选项!");
		}
		printf("请按任意键返回子菜单*_*");
		_getch();//从控件中获取字符而无需回响
		ShowBookMenu();//显示书籍管理子菜单
		scanf("%d", &iltem);
		getchar();
	}
}
void ShowReaderMenu()//显示读者管理子菜单
{
	//清屏函数
	system("cls");
	printf("\n\n");
	printf("—————————————————————————————\n");
	printf("|********************欢迎进入图书馆**********************|\n");
	printf("|********************图书馆管理系统**********************|\n");
	printf("|********************* 读者子菜单************************|\n");
	printf("|********************1.显示读者信息**********************|\n");
	printf("|********************2.新增读者信息**********************|\n");
	printf("|********************3.查找读者信息**********************|\n");
	printf("|********************4.删除读者信息**********************|\n");
	printf("|********************5.修改读者信息**********************|\n");
	printf("|********************0.返回主菜单************************|\n");
	printf("—————————————————————————————");
	printf("\n");
	printf("请选择(0-5)");
}
int ReadReaderFile(const char* pcMode)//读取读者信息文件
{
	int iReaderRecord = 0;
	FILE* pfReader; //文件指针
	pfReader = fopen("reader.txt", pcMode);
	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("\n\n");
		printf("—————————————————————————————————————\n");
		printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "姓名", "性别", "最大可借书数量", "当前可借书数量");
		for (i = 0; i < iReaderRecord; i++)
		{
			printf("%-10d%-16s%-16s%-18d%-6d\n", READER_DATA);
			printf("—————————————————————————————————————\n");
		}
		printf("\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("%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("请输入读者性别:男or女:");
		scanf("%s", astReader[iReaderRecord].acSex);
		getchar();
		int sex = 1;//标志
		while (sex)
		{
			if (strcmp(astReader[iReaderRecord].acSex, "男") == 0 || strcmp(astReader[iReaderRecord].acSex, "女") == 0)
			{
				sex = 0;
				break;
			}
			else
			{
				sex = 1;
				printf("读者性别输入错误,请重新输入:");
				scanf("%s", astReader[iReaderRecord].acSex);
			}
		}
		//读者最大可阅读数量
		printf("请输入读者最大可阅读数量:");//10,范围
		scanf("%d", &astReader[iReaderRecord].iMax);
		getchar();
		//读者当前可借阅的数量
		printf("请输入读者当前可借阅的数量:");//新增的读者10,提示,两者必须相等
		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, iReaderld, i;//要查找的编号,记录条数,记录编号,循环
	system("cls");
	iReaderRecord = ReadReaderFile("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)
		{
			iReaderld = i;//找到记录,返回记录编号
			printf("%d号读者信息如下:\n", iReaderNum);
			printf("—————————————————————————————————————\n");
			printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "姓名", "性别", "最大可借书数量", "当前可借书数量");
			printf("%-10d%-16s%-16s%-18d%-6d\n", READER_DATA);
			printf("—————————————————————————————————————\n");
			break;
		}
	}
	if (i == iReaderRecord)
	{
		printf("未找到%d号读者信息!\n", iReaderNum);
		iReaderld = -1; //找不到返回-1
	}
	return iReaderld;
}


void DeleteReader()//删除读者信息
{
	FILE* pfReader;//文件指针
	int iReaderId, iReaderRecord, 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;//index保存删除之前的读者编号,因为删除
	//之后新的读者编号就会覆盖掉原来的读者编号
	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 ShowModifyReaderMenu()//显示修改的选项
{
	printf("\n\n");
	printf("——————————————————————————\n");
	printf("********************1.编号**************************\n");
	printf("********************2.姓名**************************\n");
	printf("********************3.性别**************************\n");
	printf("********************4.最大可阅读数量****************\n");
	printf("——————————————————————————\n");
	printf("请输入所要修改的信息,请选择(1-4):");
}
//保存修改后读者信息
void SaveReaderFile(int iReaderld)
{
	FILE* pfReader;
	pfReader = fopen("reader.txt", "rb+");
	if (pfReader != NULL)
	{
		fseek(pfReader, LEN_READER * iReaderld, SEEK_SET);
		if (fwrite(&astReader[iReaderld], LEN_READER, 1, pfReader) != 1)
		{
			printf("无法保存该信息!\n");
		}
	}
	fclose(pfReader);
}
void  ModifyReader()//修改读者信息
{
	int   iReaderld, iReaderRecord, iBorrow, iItem, iNum, iMax, iFlagExist, i;
	system(" cls");
	iReaderld = SearchReader();
	if (iReaderld == -1)
	{
		return;
	}
	//找到该序号的读者,可以进行修改

	iReaderRecord = ReadReaderFile("rb");
	ShowModifyReaderMenu();//显示修改的选项
	scanf("%d", &iItem);
	getchar();

	switch (iItem)
	{
	case 1:
		printf("请输入读者编号:");
		do
		{
			iFlagExist = 0;
			scanf("%d", &iNum);
			getchar();
			for (i = 0; i < iReaderRecord; i++)
			{
				if (iNum == astReader[i].iNum && i != iReaderld)
				{
					iFlagExist = 1;
					printf("错误,该读者编号已经存在,请重新输入:");
					break;
				}
			}
		} while (iFlagExist == 1);
		astReader[iReaderld].iNum = iNum;
		break;
	case 2:
		printf("请输入读者姓名:");
		scanf("%s", astReader[iReaderld].acName);
		getchar();
		break;
	case 3:
		printf("请输入读者性别:男/女:");
		while (scanf("%s", astReader[iReaderld].acSex) > 0)
		{
			getchar();
			if (strcmp(astReader[iReaderld].acSex, "男") == 0 || strcmp(astReader[iReaderld].acSex, "女") == 0)
			{
				break;
			}
			printf("错误,只能输入“男”或者“女”,请重新输入:\n");
		}
		break;
	case 4:
		//iBorrow:已经借阅的数量
		iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
		printf("请输入读者最大可借阅的数量(范围为5-10):\n");
		while (scanf("%d", &iMax) == 1)
		{
			getchar();
			if (iMax >= 5 && iMax <= 10)
			{
				if (iBorrow > iMax)
				{
					printf("先还书!\n");
					return;
				}
				else
				{
					astReader[iReaderld].iMax = iMax;
					astReader[iReaderld].iAmount = iMax - iBorrow;
					for (i = iBorrow; i < iMax; i++)
					{
						astReader[iReaderld].Bookld[i] = 0;
					}
					break;
				}
			}
			printf("错误,读者最大可借阅的书的范围为5-10,请重新输入:\n");
		}
		break;
	}
	SaveReaderFile(iReaderld);
	printf("该读者信息已经修改成功!\n");
}
void ManageReader()//读者管理模块
{
	int rselect; //选择
	ShowReaderMenu();//显示读者管理的子菜单
	scanf("%d", &rselect);
	getchar();
	while (rselect)
	{
		switch (rselect)
		{
		case 1:
			ShowReader();//显示读者信息
			break;
		case 2:
			AddReader();//新增读者信息
			break;
		case 3:
			SearchReader();//查找读者信息
			break;
		case 4:
			DeleteReader();//删除读者信息
			break;
		case 5:
			ModifyReader();//修改读者信息
			break;
		defalut:
				printf("请输入正确的选项!");
		}
		printf("请按任意键返回子菜单*_*");
		_getch();//从控件中获取字符而无需回响
		ShowReaderMenu();//显示读者管理子菜单
		scanf("%d", &rselect);
		getchar();
	}
}
void showBorrowReturnMenu()//借还书子菜单
{
	system("cls");
	printf("\n\n");
	printf("—————————————————————————————\n");
	printf("|********************欢迎进入图书馆**********************|\n");
	printf("|********************图书馆管理系统**********************|\n");
	printf("|*********************借还书子菜单***********************|\n");
	printf("|*********************1.借书登记*************************|\n");
	printf("|*********************2.还书登记*************************|\n");
	printf("|*********************0.返回主菜单***********************|\n");
	printf("—————————————————————————————");
	printf("\n");
	printf("请选择(0-2)");
}
void BorrowBook()//借书
{
	//读者是否有资格借书
	system("cls");
	int iBookld, iReaderld, iBorrow, i;
	//输入要借书的读者编号判断编号是否存在,若存在,显示读者已经借阅的图书信息
	iReaderld = SearchReader();
	if (iReaderld==-1)
	{
		return;
	}
	iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
	if (iBorrow == 0)
	{
		printf("该读者目前没有借阅任何书!");
	}
	else
	{
		printf("该读者当前所借图书为:");
		for (i = 0; i < iBorrow; i++)
		{
			printf("%d ", astReader[iReaderld].Bookld[i]);
		}
	}
	if (astReader[iReaderld].iAmount == 0)
	{
		printf("读者可以借书数量为0,不能继续借书!\n");
	}
	//书籍是否可以被借阅(书籍是否存在,库存是否还有,借书后读者最大可借阅书籍减少)
	printf("\n请按任意键输入要借阅的图书信息*_*\n");
	_getch();
	iBookld = SearchBook();
	if (iBookld == -1)
	{
		return;
	}
	if (astBook[iBookld].iAmount == 0)
	{
		printf("该图书库存为0,图书不可借阅!\n");
		return;
	}
	//借书操作
	astReader[iReaderld].Bookld[iBorrow] = astBook[iBookld].iNum;
	//图书的库存减一
	astBook[iBookld].iAmount--;
	//当前可借阅的书的数量减一
	astReader[iReaderld].iAmount--;

	SaveBookFile(iBookld);
	SaveReaderFile(iReaderld);
	printf("借书成功!\n");
}
void ReturnBook()//还书
{
	system("cls");
	int iBookld, iReaderld, iBorrow, i, j;
	//读者
	iReaderld = SearchReader();
	if (iReaderld == -1)
	{
		return;
	}
	iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
	if (iBorrow == 0)
	{
		printf("该读者未借阅任何书,无需归还\n");
		return;
	}
	else
	{
		printf("\n该读者当前借阅的图书为:");
		for (i = 0; i < iBorrow; i++)
		{
			printf("%d ", astReader[iReaderld].Bookld[i]);
		}
	}
	printf("\n按任意键输入要归还的图书信息\n");
	_getch();
	//图书在不在
	iBookld = SearchBook();
	if (iBookld == -1)
		return;
	//借书列表里有没有这本书
	for (i = 0; i < iBorrow; i++)
	{
		if (astReader[iReaderld].Bookld[i] == astBook[iBookld].iNum)
		{
			//还书
			for (j = i; j < iBorrow-1; j++)
			{
				astReader[iReaderld].Bookld[j] = astReader[iReaderld].Bookld[j + 1];
			}
			astReader[iReaderld].Bookld[iBorrow - 1] = 0;
			//图书库存加一
			astBook[iBookld].iAmount++;
			//读者的可借书的数量+1
			astReader[iReaderld].iAmount++;
			break;
		}
	}
	if (i == iBorrow)
	{
		printf("该读者未借阅这本书,无需归还");
		return;
	}
	SaveBookFile(iBookld);
	SaveReaderFile(iReaderld);
	printf("还书成功!\n");
}
void ManageBorrowReturn()//借还书管理模块
{
	showBorrowReturnMenu();//借还书的子菜单
	int iltem;
	scanf("%d", &iltem);
	getchar();
	while (iltem)
	{
		switch (iltem)
		{
		case 1:
			BorrowBook();//借书
			break;
		case 2:
			ReturnBook();//还书
			break;
		default:
			printf("请输入正确的选项!\n");
		}
		printf("请按任意键返回子菜单*_*");
		_getch();//从控件中获取字符而无需回响
		showBorrowReturnMenu();//显示借还书管理子菜单
		scanf("%d", &iltem);
		getchar();
	}
}
int main()
{
	//显示主函数界面
	Meau();
	int num;
	scanf("%d", &num);
	while (num)
	{
		switch (num)
		{
		case 1:
			ManageBook();//图书管理模块
			break;
		case 2:
			ManageReader();//读者管理模块
			break;
		case 3:
			ManageBorrowReturn();//借还书管理模块
			break;
		default:
			printf("请输入正确选项!\n程序将于3秒后跳转主菜单");
			Sleep(3000);
		}
		Meau();
		scanf("%d", &num);
		getchar();
	}
	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章           查看所有文章
加:2022-02-28 15:10:05  更:2022-02-28 15:14:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:39:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码