2022.2.26 图书管理系统2---第二模块:读者管理系统

69 篇文章 3 订阅

注意:第二块和第一块是类似的,最主要不同的是最后一个修改信息函数,要明白其中读者最大可借阅数量和当前可借阅数量是有关系的。

代码如下:

#define _CRT_SECURE_NO_WARNINGS  //scanf宏定义
#include<stdio.h>
#include<windows.h>
#include<conio.h>




#define READER_NUM 100
#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 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 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 ShowReaderMenu()
{
	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|************************4.删除读者信息***********************|\n");
	printf("\t|************************5.修改读者信息***********************|\n");
	printf("\t|************************0.返回主菜单***********************|\n");
	printf("\n");
	printf("\t\t请选择(0-5)");
}

//读取文件中信息
int ReadReaderFile(const char *fopenMode)
{
	int iReaderRecord = 0;
	FILE* pfReader;//文件指针
	pfReader = fopen("reader.txt", fopenMode);
	if (pfReader == NULL)
	{
		return -1;
	}
	while (!feof(pfReader))//feof函数指的是,一直读取直到结尾
	{
		if (fread(&astReader[iReaderRecord], LEN_READER, 1, pfReader))
		{
			iReaderRecord++;//读一个加一条记录
		}
	}
	fclose(pfReader);
	return iReaderRecord;
}

//显示读者信息
void ShowReader()
{
	int i, iReaderRecord;//记录条数
	system("cls");
	iReaderRecord = ReadReaderFile("rb");//从ReadBookFile文件中读取信息
	if (iReaderRecord == -1)
	{
		printf("该文件打开失败,请先增加读者信息!\n");
	}
	if (iReaderRecord == 0)
	{
		printf("文件中没有读者信息!\n");
	}
	else
	{
		printf("\t|*********************************************|\n");
		printf("\n\n");
		printf("\t%-6s%-16s%-10s%-20s%-4s\n", "编号", "姓名", "性别", "最大可借书数量", "当前可借书数量");
		for (i = 0; i < iReaderRecord; i++)
		{
			printf("\t%-6d%-16s%-10s%-20d%-4d\n", READER_DATA); //READER_DATA宏定义,读者信息,struct Reader中
		}
		printf("\n\n");
		printf("\t|***************************************************|\n");
		printf("\n\n");
	}
}

//增加读者信息
void AddReader()
{
	FILE* pfReader;
	int iReaderRecord, iFlagExist, i; //iFlagExist编号不能重复
	char cFlag;

	system("cls");
	iReaderRecord = ReadReaderFile("ab+");//ab+追加方式打开文件或者新建二进制文件
	if (iReaderRecord == -1)
	{
		printf("文件打开失败\n");
		return;
	}
	else if (iReaderRecord == 0)
	{
		printf("没有读者记录\n");
	}
	else
	{
		ShowReader();//如果图书记录不为0,则显示所有图书
	}
	//循环录入图书信息
	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)//只能录入200个数据
		{
			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("请输入读者性别:");
		scanf("%s", astReader[iReaderRecord].acSex);
		getchar();

		printf("请输入读者最大可借阅数量:");
		scanf("%d", &astReader[iReaderRecord].iMax);//范围 10
		getchar();

		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, iReaderld, i;
	//i其中ReaderNum表示编号   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 < iReaderNum; i++)
	{
		if (iReaderNum == astReader[i].iNum)
		{
			iReaderld = i;//找到记录,返回记录编号
			printf("%d号图书信息如下:\n", iReaderNum);
			printf("\t|*********************************************|\n");
			printf("\t %-6s%-16s%-10s%-20s%-4s\n", "编号", "姓名", "性别", "最大可借阅数量", "当前可借阅数量");
			printf("\t %-6d%-16s%-10s%-20d%-4d\n", READER_DATA);//用宏定义减少代码量
			printf("\t|*********************************************|\n");
			break;
		}
	}
	if (i == iReaderRecord)
	{
		printf("找不到%d号图书信息\n", iReaderNum);
		iReaderld = -1;//找不到记录,返回-1;
	}
	return iReaderld;
}

//删除图书信息
void DeleteReader()
{
	FILE* pfReader;
	int iReaderld, iReaderRecord, i;
	char cFlag;

	system("cls");
	iReaderld = SearchBook();
	if (iReaderld == -1)
	{
		return;
	}
	iReaderRecord = ReadBookFile("rb");//
	printf("已经找到该图书,是否删除?(y/n)");
	cFlag = getchar();
	getchar();
	//删除之前需要保存删除之前的图书编号,因为删除之后图书编号信息会被覆盖
	int index = astReader[iReaderld].iNum;
	if (cFlag == 'n')
	{
		return;
	}
	else if (cFlag == 'y')
	{
		for (i = 0; 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\n");
	printf("\t                       1.编号                     \n");
	printf("\t                       2.姓名                      \n");
	printf("\t                       3.性别                      \n");
	printf("\t                       4.最大可借阅数量                     \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);
}

//修改读者信息,注意,与上面图书修改信息是不一样的,可修改的有:编号,姓名,性别,最大可借阅数量,当前可借阅数量
//iMax修改成功后,iAmount跟着自动变化,注意两者的相关,相当于修改四个编号,姓名,性别,最大可借阅数量
void ModifyReader()
{
	int iReaderld, iReaderRecord, iBorrow, iltem, iNum, iMax, iFlagExit, i;
	system("cls");
	iReaderld = SearchReader();
	if (iReaderld == -1)
	{
		return;
	}
	//找到该序号的读者可以进行修改
	iReaderRecord = ReadReaderFile("rb");
	ShowModifyReaderMenu();//显示修改的选项
	scanf("%d", &iltem);
	getchar();
	switch (iltem)
	{
	case 1:
		printf("请输入读者编号:");
		do
		{
			iFlagExit = 0;
			scanf_s("%d", &iNum);
			getchar();
			for (i = 0; i < iReaderRecord; i++)
			{
				if (iNum == astReader[i].iNum && i != iReaderld)
				{
					iFlagExit = 1;
					printf("错误,该读者编号已经存在,请重新输入:");
					break;
				}
			}

		} while (iFlagExit == 1);
		astReader[iReaderld].iNum = iNum;
		break;
	case 2:
		printf("请输入读者姓名:");
		scanf("%s", astReader[iReaderld].acName);
		getchar();
		break;
	case 3:
		printf("请输入读者性别:F/M");
		while (scanf("%s", astReader[iReaderld].acSex) > 0)
		{
			getchar();
			if (strcmp(astReader[iReaderld].acSex, "F") == 0 || strcmp(astReader[iReaderld].acSex, "M") == 0)
			{
				break;
			}
			printf("错误,只能输入'F'或者'M',请重新输入\n");
		}//只能是F或者M,如果输入不是,那么一直在这个循环里面。
		break;
	case 4:         //重点
		iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;//iBorrow:已经借阅的数量
		printf("请输入读者最大可借阅数量(范围为5-10):");
		while (scanf("%d", &iMax) == 1)
		{
			getchar();
			if (iMax >= 5 && iMax <= 10)
			{
				if (iBorrow > iMax)
				{
					printf("该读者目前图书借阅数量大于该数目,请先还书!");
					return;
				}
				else
				{
					astReader[iReaderld].iMax = iMax;
					astReader[iReaderld].iAmount = iMax - iBorrow;
					for (i = iBorrow; i < iMax; i++)
					{
						astReader[iReaderld].Bookld[i] = 0;//将后面的读书列表全部置为0
					}
					break;
				}
			}
			printf("错误,读者最大可借阅的书的范围为5-10,请重新输入");
		}
		break;
	}
	SaveReaderFile(iReaderld);
	printf("该读者信息已修改成功!\n");
}

//读者管理模块
void MangageReader()
{
	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;
		default:
			printf("\t\t请输入正确的数字!\n");
		}
		printf("|请按任意键返回子菜单|");
		_getch();
		ShowBookMenu();
		scanf("%d", &rselect);
		getchar();
	}

}
int main()
{
	//显示主函数的界面;
	ShowMainMeun();
	int iltem;
	scanf("%d", &iltem);
	while (iltem)//只要iltem不是0,就这一直在这个循环中,直到遇到0,突出整个系统
	{
		switch (iltem)
		{
		case 1:
			MangageBook();//图书管理模块
			break;
		case 2:
			MangageReader();//读者管理模块
			break;
		case 3:
			//todo
			//BorrowReturnManger();//借还书模块
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t程序将于3秒后跳转到主菜单");
			Sleep(3000);
		}
		ShowMainMeun();
		scanf("%d", &iltem);
		getchar();

	}
	return 0;
}

//注意,写完后,自己运行,一定要一步一步来检验自己写的是否正确!!!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值