栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022.2.24 项目-图书馆管理系统1---图书管理模块

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022.2.24 项目-图书馆管理系统1---图书管理模块

1. 设计思路

图书:(增删改查) 显示

读者:(增删改查) 显示 借书 还书 主菜单 子菜单

系统如下图

如上图,实际上只需要执行三个模块:图书管理模块,读者管理模块,借书还书登记模块

2. 实现图书管理模块

#define _CRT_SECURE_NO_WARNINGS  //scanf宏定义
#include
#include
#include



#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)

//两个结构体封装图书和读者的基本信息
//图书
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 ShowMainMeun()
{
    //清屏函数
	system("cls");
	printf("nnnnn");
	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("tt请选择(0-3)");
}

//显示书籍管理的子菜单
void ShowBookMenu()
{
	system("cls");
	printf("nnnnn");
	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("tt请选择(0-5)");
}

//从文件中读取记录
int ReadBookFile(const char* pcMode)
{
	int iBookRecord = 0;
	FILE* pfBook;//文件指针
	pfBook = fopen("book,txt", pcMode);//用fopen_s
	if(pfBook==NULL)
	{
		return -1;
	}
	while (!feof(pfBook))//feof函数指的是,一直读取直到结尾
	{
		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("nn");
		printf("t%-6s%-16s%-10s%-20s%-4sn","图书编号","书名","作者","出版社","库存量");
		for(i = 0; i < iBookRecord; i++)
		{
			printf("t%-6d%-16s%-10s%-20s%-4dn", BOOK_DATA); //BOOK_DATA宏定义
		}
		printf("nn");
		printf("t|***************************************************|n");
		printf("nn");
	}
}
//新增图书信息
void AddBook()
{
	FILE* pfBook;
	int iBookRecord, iFlagExist,i; //iFlagExist编号不能重复
	char cFlag;
	system("cls");
	iBookRecord = ReadBookFile("ab+");//ab+追加方式打开文件或者新建二进制文件
	if (iBookRecord == -1)
	{
		printf("文件打开失败n");
		return;
	}
	else if (iBookRecord == 0)
	{
		printf("没有图书记录n");
	}
	else
	{
		ShowBook();//如果图书记录不为0,则显示所有图书
	}
	//循环录入图书信息
	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)//只能录入200个数据
		{
			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;
	//i其中BookNum表示编号   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 < iBookNum; i++)
	{
		if (iBookNum == astBook[i].iNum)
		{
			iBookld = i;//找到记录,返回记录编号
			printf("%d号图书信息如下:n", iBookNum);
			printf("t|*********************************************|n");
			printf("t %-6s%-16s%-10s%-20s%-4sn", "图书编号", "书名", "作者", "出版社", "库存量");
			printf("t %-6d%-16s%-10s%-20s%-4dn", BOOK_DATA);//用宏定义减少代码量
			printf("t|*********************************************|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;
	}
	iBookRecord = ReadBookFile("rb");//
	printf("已经找到该图书,是否删除?(y/n)");
	cFlag = getchar();
	getchar();
	//删除之前需要保存删除之前的图书编号,因为删除之后图书编号信息会被覆盖
	int index = astBook[iBookld].iNum;
	if (cFlag == 'n')
	{
		return;
	}
	else if (cFlag == 'y')
	{
		for (i = 0; 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("nnn");
	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 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;
	system("cls");
	iBookld = SearchBook();
	if (iBookld == -1)
	{
		return;
	}
	if (iBookld == -3)
	{
		return;
	}
	//找到该序号的图书,可以进行修改操作
	iBookRecord = ReadBookFile("rb");
	//显示修改选项的子菜单
	ShowModifyBookMenu();
	scanf_s("%d", &iltem);
	getchar();
	switch (iltem)
	{
	case 1:
		printf("请输入图书编号");
		do
		{
			iFlagExist = 0;
			scanf_s("%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 MangageBook()
{
	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("tt请输入正确的数字!ntt");
		}
		printf("|请按任意键返回子菜单|");
		_getch();//从控件中获取字符而无需回显,头文件conio
		ShowBookMenu();
		scanf("%d", &iltem);
		getchar();
	}
}

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

	}
	return 0;
}

最后运行显示界面类似如下,再进一步实现其中的信息

 

注意:可以自己操作实现第一模块,注意其中的宏定义部分代表的含义,还有每个函数中的子函数注意点,下一篇写第二模块---读者管理模块。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/766833.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号