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++知识库]图书管理系统:图书管理模块

// ConsoleApplication4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<stdio.h>
#include<conio.h>
#include<Windows.h>
#include<iostream>

#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  _CRT_SECURE_NO_WARNINGS
//两个结构体封装图书和读者的基本信息
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\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 ShowBookMenu()
{
	system("cls");
	printf("\n\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 ReadBookFile(const char* pcMode)
{
	int iBookRecord = 0;
	FILE* pfBook;//定义的文件指针
	//pfBook = fopen("book.txt", pcMode);//以只读的方式打开
	fopen_s(&pfBook, "book.txt", pcMode);
	if (pfBook == NULL)
	{
		return -1;
	}
	while (!feof(pfBook))//当没有读到尾时,则循环继续
	{
		if (fread(&astBook[iBookRecord], LEN_BOOK, 1, pfBook))//从pfBook中一次读取一个,以LEN_BOOK为单位,读在astBook[iBookRecord]中
		{
			iBookRecord++;
		}
		fclose(pfBook);
		return iBookRecord;
	}
}
void ShowBook()
{
	int i;//定义的下标
	int iBookRecord;//记录条数
	system("cls");//清屏
	iBookRecord = ReadBookFile("rb");//以只读的方式读取文件中的数据(只显示不修改)
	if (iBookRecord ==-1)
	{
		printf("该文件打开失败,请先新增图书信息!/n");
	}
	if (iBookRecord == 0)
	{
		printf("文件中没有图书信息!/n");
	}
	else
	{
		printf("\t|********************************************************|\n");
		printf("\n\n\n");
		printf("\t%-6s%-16s%-10s%-20s%-4s\n", "编号", "书名", "作者", "出版社", "库存量");
		for (i = 0; i < iBookRecord; i++)
		{
			printf("\t%-6d%-16s%-10s%-20s%-4d\n", BOOK_DATA);
		}
		printf("\n\n\n");
		printf("\t|********************************************************|\n");
		printf("\n\n\n");
	}

}
void AddBook()
{
	FILE* pfBook;//文件指针
	int iBookRecord;
	int iFlagExist=0;//编号是否存在
	int i=0;
	char cFlag;//是否继续
	system("cls");//清屏
	iBookRecord = ReadBookFile("ab+");//ab+追加方式打开或者二进制方式
	if (iBookRecord == -1)
	{
		printf("该文件打开失败,请先新增图书信息!/n");
	}
	else if (iBookRecord == 0)
	{
		printf("文件中没有图书信息!/n");
	}
	else
	{
		ShowBook();//如果图书记录不为0,则显示所有图书
	}
//循环录入图书信息
	printf("请选择是否输入信息(y/n):");
	cFlag = getchar();
	if (cFlag == 'n')
	{
		return;
	}
	//pfBook = fopen("book.txt", "ab+");
	fopen_s(&pfBook,"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);
		 printf("请输入图书名称:");
		 scanf_s("%s", &astBook[iBookRecord].acName);
		 getchar();
		 printf("请输入图书作者:");
		 scanf_s("%s", &astBook[iBookRecord].acAuthor);
		 getchar();
		 printf("请输入图书出版社:");
		 scanf_s("%s", &astBook[iBookRecord].acPress);
		 getchar();
		 printf("请输入图书库存量:");
		 scanf_s("%d", &astBook[iBookRecord].iAmount);
		 getchar();
		//将新增的图书信息写入文件中

		 if (fwrite(&astBook[iBookRecord],LEN_BOOK,1,pfBook) != 1)//将数据astBook[iBookRecord]写入文件流pfBook
		 {
			 printf("无法保存该信息!\n");
				 return;
		 }
		 else
		 {
			 printf("%d号信息已经正常保存!\n", astBook[iBookRecord].iNum);
			 iBookRecord++;
				 return;
		 }
		printf("继续输入信息吗(y/n):");
		cFlag = getchar();
	}
	fclose(pfBook);
	printf("添加图书信息执行完毕!\n");
}
//查询
int SearchBook()
{
	int iBookNum;//输入要查找的编号
	int iBookRecord;//记录条数
	int iBookId;//找到的编号
	int i;//循环要用的
	system("cls");//清屏
	iBookRecord = ReadBookFile("rb");//以只读的方式打开
	if (iBookRecord == -1)
	{
		printf("该文件打开失败!/n");
		printf("请按任意键返回子菜单!/n");
		_getch();
		return -2;
	}
	else if (iBookRecord == 0)
	{
		printf("文件中没有图书信息!\n");
		printf("请按任意键返回子菜单!\n");
		_getch();
		return -3;
	}
	//进入查找程序
	printf("请输入图书编号:\n");
	scanf_s("%d", &iBookNum);
	getchar();
	for (i = 0; i < iBookRecord; i++)
	{
		if (iBookNum == astBook[i].iNum)
		{
			iBookId = i;//找到记录,返回记录编号
			printf("%d号图书信息如下:\n", iBookNum);
			printf("\t---------------------------------------------------------------\n");
			printf("\t %-6s%-16s%-10s%-20s%-4s\n", "图书编号", "书名", "作者", "出版社", "库存量");
			printf("\t %-6d%-16s%-10s%-20s%-4d\n", BOOK_DATA);
			printf("\t---------------------------------------------------------------\n");
			break;
		}
	}
	if (i == iBookRecord)
	{
		printf("找不到%d号图书信息!\n", iBookNum);
		iBookId = -1;//返回-1
	}
}
void DeleteBook()
{
	FILE* pfBook;
	 int iBookNum=0;//输入要查找的编号
	int iBookRecord;//记录条数
	int iBookId=0;//找到的编号
	int i;//循环要用的
	char cFlag;//是否要删除的标记
	system("cls");//清屏
	iBookRecord = SearchBook();//调用查询函数
	if (iBookId == -1)
	{
		return;
	}
	iBookRecord = ReadBookFile("rb");//以只读的方式打开文件
	printf("已经找到该图书。是否删除?(y/n)");
	cFlag = 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--;
	}
	fopen_s(&pfBook,"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()
{
	system("cls");
	printf("\n\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     请输入所要修改的信息(输入相应的数字1-5):\n");
	
}
void SaveBookFile(int iBookId)
{
	FILE* pfBook;
	fopen_s(&pfBook,"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 Modifyook()
{
	int iBookNum = 0;//输入要查找的编号
	int iBookRecord;//记录条数
	int iBookId = 0;//找到的编号
	int iFlagExist;//是否重复
	int iltem;//选择
	int iNum;
	int i;//循环要用的
	system("cls");//清屏
	iBookRecord = SearchBook();//调用查询函数
	if (iBookId == -1)
	{
		return;
	}//找到该编号的图书,则可进行修改
	iBookRecord = ReadBookFile("rb");//以只读的方式打开文件
	//显示修改选项的子菜单
	ShowModifyBookMenu();
	scanf_s("%d", &iltem);
	getchar();
	switch (iltem)
	{
	case1:
		printf("请输入图书编号:");
		do{
			iFlagExist = 0;
			scanf_s("%d", &iNum);
			getchar();
			for (i = 0; i < iBookRecord; i++)
			{
				if (iNum == astBook[i].iNum && i != iBookId)
				{
					iFlagExist = 1;
					printf("错误,该图书编号已经存在,请重新输入:");
					break;
				}
			}
		} while (iFlagExist == 1);
		break;
	case2:
		printf("请输入图书名称:");
		scanf_s("%s", &astBook[iBookId].acName);
		getchar();
		break;
	case3:
		printf("请输入图书作者:");
		scanf_s("%s", &astBook[iBookId].acAuthor);
		getchar();
		break;
	case4:
		printf("请输入图书出版社:");
		scanf_s("%s", &astBook[iBookId].acPress);
		getchar();
		break;
	case5:
		printf("请输入图书库存量:");
		scanf_s("%d", &astBook[iBookId].iAmount);
		getchar();
		break;
	}
	SaveBookFile(iBookId);
	printf("图书信息修改成功!\n");
}
void MangeBook()//书籍管理
{
	int iltem;
	ShowBookMenu();//显示书籍管理子菜单
	scanf_s("%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:
			Modifyook();//修改图书信息
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t");
			printf("请按任意键返回子菜单");
			_getch();//从控件中获取字符不回显
			ShowBookMenu();//显示书籍管理子菜单
			scanf_s("%d", &iltem);
			getchar();
		}
	}
}
int main()
{
	ShowMainMeun();
	int iltem;
	scanf_s("%d", &iltem);
	while (iltem)
	{
		switch(iltem)
		{
			case 1:
				MangeBook();
				break;
			case 2:
				//MangeReader();
				break;
			case 3:
				//to do
				//BorrowReturnManger();
				break;
			default:
				printf("\t\t请输入正确的数字!\n\t程序将于3秒后跳转主菜单");
				Sleep(3000);//休眠3秒
				ShowMainMeun();
				scanf_s("%d", &iltem);
				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-03-08 22:10:02  更:2022-03-08 22:13:38 
 
开发: 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 6:05:36-

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