一个简单的图书管理系统(EasyX cpp)

这是一个使用C++实现的图形化图书信息管理系统,具备图书的借阅、查询、修改和增删等功能。用户界面友好,采用EasyX库进行图形绘制,支持管理员和普通用户的操作。系统读取和保存数据至文件,具有错误检查和用户交互反馈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

东南大学吴健雄学院22级期中大作业,为了体现创新性自学EasyX去尝试写一个图形化界面;

代码分为三个模块,头文件,首页,其余部分;

其实可以一个文件写完,按照老师要求尝试使用多个文件协同;

代码实现了图书的借阅,查询,修改等基础功能,可以显示图书名字,作者,图书总量,在馆总量,借出数,后续可能增加关键词查找(模糊查找功能);

部分运行图片:

 

图形化代码参考了其他几位大佬,在他们的基础上进行了一定修改,没有讲到指针,故代码没有使用链表.

这里是头文件以及函数的声明

#pragma once
#include<cstdlib>//exit的使用
#include<graphics.h>
#include<conio.h>
#include <cstdio>
#include <stdlib.h>//动态分配内存
#include<cstring>
#include<ctype.h>//检测字符
#include<stdbool.h>//bool
#include<iostream>
#include<fstream>
#define RecordNums 15//结构体数组数量
using namespace std;

//函数声明
void Startup();
void FirstPage();
void AdminSignIn();//管理员登录界面
void AdminPage();//进入管理员界面
void CommonUserPage();//进入普通用户界面
void InputInfor();//录入图书信息到文件中
void SaveInfor();//保存录入的图书信息
void ReadInfor();//读取文件
void AdDeSeMoPage();//增删改查界面
bool BookFormat(char PerStr[]);//判断图书名格式
void SimplePrint();//单纯打印一遍
void ShowAllInfor();//显示全部数据
int ReturnPosition();//接收用户要查询的信息下标
int RePosition();//返回借阅图书的下标
void PrintFoudInfor(int Position);//打印找到的信息
void PrintFoudInfor();//查询的整体调用
void DesignateBook();//指定位置删除
void ModifyBookInfor();//修改信息
void DeleteBookInfor();//彻底清空
void BorrowReturnPage();//借阅归还界面
void BorrowBook();//借阅图书
void ReturnBook();//归还图书
//创建图书结构体
struct Book
{
	char title[20];//书名
	char author[20];//作者
	char total[2];//总量
	char borrow[2];//借出数
	char exist[2];//现在在馆量
};
//创建管理员结构体
struct Admin
{
	char UserName[64];
	char PassWord[64];
};

这里是两个cpp文件

#include"File.h"
IMAGE img_bk;//背景图片
void FirstPage()//首页画面
{
	//进入程序首先读取数据——获得当前NowBookNums
	ReadInfor();

	cleardevice();
	BeginBatchDraw();//开始批量绘图
	putimage(0, 0, &img_bk);//输出图片
	setbkmode(TRANSPARENT);//设置背景模式透明

	setfillcolor(GREEN);//填充颜色

	//大标题
	settextstyle(60, 0, "黑体");
	outtextxy(150, 100, "图书信息管理系统");
	//首页三个选项的背景
	fillrectangle(230, 445, 560, 490);
	fillrectangle(230, 505, 560, 550);
	fillrectangle(230, 565, 560, 610);

	setbkmode(TRANSPARENT);

	//三个选项的文字
	settextstyle(40, 0, "黑体");

	//首页三个选项
	outtextxy(240, 450, "管理员操作界面");
	outtextxy(240, 510, "普通用户操作界面");
	outtextxy(240, 570, "退出系统");

	EndBatchDraw();//执行未完成的输入任务,并结束批量绘制

	//鼠标操作1
	MOUSEMSG m1;
	//进入主界面选项操作界面
	while (1)
	{
		m1 = GetMouseMsg();//获取鼠标操作
		if (m1.x >= 230 && m1.x <= 560 && m1.y >= 445 && m1.y <= 490)//管理员界面
		{
			setlinecolor(RED);//选中后画红
			rectangle(230, 445, 560, 490);//画红边框

			if (m1.uMsg == WM_LBUTTONDOWN)//鼠标按下左键后
			{
				AdminSignIn();//进入管理员界面
			}
		}
		else if (m1.x >= 230 && m1.x <= 560 && m1.y >= 505 && m1.y <= 550)//普通用户界面
		{
			setlinecolor(RED);
			rectangle(230, 505, 560, 550);
			if (m1.uMsg == WM_LBUTTONDOWN)
			{
				CommonUserPage();
			}
		}
		else if (m1.x >= 230 && m1.x <= 560 && m1.y >= 565 && m1.y <= 610)//退出
		{
			setlinecolor(RED);
			rectangle(230, 565, 560, 610);
			if (m1.uMsg == WM_LBUTTONDOWN)
			{
				exit(0);
			}
		}
		//鼠标不在上面悬停
		//那么我们显然要画白框框
		else
		{
			setlinecolor(WHITE);
			rectangle(230, 445, 560, 490);
			rectangle(230, 505, 560, 550);
			rectangle(230, 565, 560, 610);
		}
	}
}
#include"File.h"
#include"FirstPage.cpp"
int NowBookNums = 0;//当前记录了多少条图书信息
int FlagAI = -1;//显示全部数据的页面跳转标识
//1为管理员,-1为普通用户
int FlagFPT = -1;//查询找到页面跳转标识
//1为管理员,-1为普通用户
Book LibraryArry[RecordNums];//创建图书结构体数组
Admin AdminUser;//创建一个管理员用户
int main()
{
	Startup();//数据初始化
	while (1)
	{
		FirstPage();//显示画面 
	}
	return 0;
}
//先搭图形窗口
//逐步实现
void Startup()//初始化数据读入图
{
	initgraph(760, 760);
	loadimage(&img_bk, "background.jpeg", 760, 760);//读取图片
}
//right
//管理员界面
void AdminPage()
{
	initgraph(760, 760);
	cleardevice();//清屏函数
	//定义第二个鼠标操作
	MOUSEMSG m2;
	cleardevice();
	IMAGE img_bk;;
	loadimage(&img_bk, "admin.jpg", 760, 760);//读图
	putimage(0, 0, &img_bk);
	setfillcolor(GREEN);
	setbkmode(TRANSPARENT);
	settextstyle(50, 0, "黑体");
	outtextxy(50, 150, "管");
	outtextxy(50, 210, "理");
	outtextxy(50, 270, "员");
	outtextxy(50, 330, "操");
	outtextxy(50, 390, "作");
	outtextxy(50, 450, "界");
	outtextxy(50, 510, "面");
	setbkmode(TRANSPARENT);//透明背景
	//三个选项的背景
	fillrectangle(230, 240, 560, 285);
	fillrectangle(230, 370, 560, 415);
	fillrectangle(230, 500, 560, 545);
	setbkmode(TRANSPARENT);//透明背景
	//三个选项的文字
	settextstyle(40, 0, "黑体");
	//三个选项
	outtextxy(270, 240, "显示所有数据");
	outtextxy(270, 370, "增删查改数据");
	outtextxy(350, 500, "返回");
	EndBatchDraw();//这个函数用于结束批量绘制,并执行未完成的绘制任务。
	//进入主界面选项操作界面
	while (1)
	{
		m2 = GetMouseMsg();//获取鼠标操作鼠标的坐标值,应该是一个结构体
		if (m2.x >= 230 && m2.x <= 560 && m2.y >= 240 && m2.y <= 285)//显示所有数据
		{
			setlinecolor(RED);//同第一个画线
			rectangle(230, 240, 560, 285);
			if (m2.uMsg == WM_LBUTTONDOWN)//按下左键
			{
				FlagAI = -1;//这里赋值-1是为了后续跳转回原来的管理员界面
				//不然管理员做一件事就回到主界面太弱智了
				ReadInfor();//这个函数是读入
				ShowAllInfor();//这个函数是为了展示界面
			}
		}
		else if (m2.x >= 230 && m2.x <= 560 && m2.y >= 370 && m2.y <= 415)//增删数据
		{
			setlinecolor(RED);
			rectangle(230, 370, 560, 415);
			if (m2.uMsg == WM_LBUTTONDOWN)
			{
				AdDeSeMoPage();
			}
		}
		else if (m2.x >= 230 && m2.x <= 560 && m2.y >= 500 && m2.y <= 545)//返回
		{
			setlinecolor(RED);
			rectangle(230, 500, 560, 545);
			if (m2.uMsg == WM_LBUTTONDOWN)
			{
				cleardevice();
				FirstPage();
			}
		}
		//没点到显示白色
		else
		{
			setlinecolor(WHITE);
			rectangle(230, 240, 560, 285);
			rectangle(230, 370, 560, 415);
			rectangle(230, 500, 560, 545);
		}
	}
}
//right
//普通用户界面
void CommonUserPage()
{
	initgraph(760, 760);
	cleardevice();
	//定义第三个鼠标操作
	MOUSEMSG m3;
	cleardevice();//清屏
	BeginBatchDraw();
	//这个函数用于开始批量绘图。执行后,任何绘图操作都将暂时不输出到绘图窗口上
	//直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出
	IMAGE img_bk;//声明图片
	loadimage(&img_bk, "CommonUserPage.jpg", 760, 760);
	putimage(0, 0, &img_bk);//从左上角开始铺展图片
	setbkmode(TRANSPARENT);//透明
	setfillcolor(GREEN);//绿色背景
	settextstyle(50, 0, "黑体");
	outtextxy(50, 150, "普");
	outtextxy(50, 210, "通");
	outtextxy(50, 270, "用");
	outtextxy(50, 330, "户");
	outtextxy(50, 390, "操");
	outtextxy(50, 450, "作");
	outtextxy(50, 510, "界");
	outtextxy(50, 570, "面");
	setbkmode(TRANSPARENT);
	//三个选项的背景
	//4个数据,前两个坐上角坐标点,后两个右下角坐标点
	fillrectangle(230, 150, 560, 200);//这个函数用于画有边框的填充矩形。
	fillrectangle(230, 300, 560, 350);
	fillrectangle(230, 450, 560, 500);
	fillrectangle(230, 600, 560, 650);
	setbkmode(TRANSPARENT);//透明
	//三个选项的文字
	settextstyle(30, 0, "黑体");
	outtextxy(310, 160, "显示所有数据");//高,宽,字符;
	outtextxy(320, 310, "查询数据");
	outtextxy(320, 460, "借阅/归还");
	outtextxy(350, 610, "返回");
	EndBatchDraw();//这个函数用于结束批量绘制,并执行未完成的绘制任务。
	//进入主界面选项操作界面
	while (1)
	{
		m3 = GetMouseMsg();//获取鼠标操作
		//这个函数用于获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。
		//简单来说就是获取鼠标的位置的
		if (m3.x >= 230 && m3.x <= 560 && m3.y >= 150 && m3.y <= 200)//选项1 显示所有数据
		{
			setlinecolor(RED);
			rectangle(230, 150, 560, 200);
			if (m3.uMsg == WM_LBUTTONDOWN)//左键点击
			{
				FlagAI = 1;
				ReadInfor();
				ShowAllInfor();
				CommonUserPage();
			}
		}
		else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 300 && m3.y <= 350)//选项2 查询数据
		{
			setlinecolor(RED);
			rectangle(230, 300, 560, 350);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				FlagFPT = -1;
				PrintFoudInfor();
				CommonUserPage();
			}
		}
		else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 450 && m3.y <= 500)//选项3——借阅、归还
		{
			setlinecolor(RED);
			rectangle(230, 450, 560, 500);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				BorrowReturnPage();
			}
		}
		else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 600 && m3.y <= 650)//选项4——返回
		{
			setlinecolor(RED);
			rectangle(230, 600, 560, 650);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				cleardevice();
				FirstPage();
			}
		}
		//没点到显示白色
		else
		{
			setlinecolor(WHITE);
			rectangle(230, 150, 560, 200);
			rectangle(230, 300, 560, 350);
			rectangle(230, 450, 560, 500);
			rectangle(230, 600, 560, 650);
		}
	}
}
//rihgt
//三个页面的设计结束
void InputInfor()//图书信息录入
{
	while (1)
	{
		InputBox(LibraryArry[NowBookNums].title, 20, "请输入需要录入的图书名称:");//显示一个输入框,
		if (BookFormat(LibraryArry[NowBookNums].title))//为真跳出循环
		{
			break;
		}
	}
 	while (1)
	{
		InputBox(LibraryArry[NowBookNums].author, 20, "请输入需要录入的图书作者名称:");//显示一个输入框,
		if (BookFormat(LibraryArry[NowBookNums].author))//为真跳出循环
		{
			break;
		}
	}
	while (1)
	{
		InputBox(LibraryArry[NowBookNums].total, 20, "请输入需要录入的图书总数为:");//显示一个输入框,
		if (BookFormat(LibraryArry[NowBookNums].total))//为真跳出循环
		{
			break;
		}
	}
	while (1)
	{
		InputBox(LibraryArry[NowBookNums].borrow, 20, "请输入需要录入的图书借出数为:");//显示一个输入框,
		if (BookFormat(LibraryArry[NowBookNums].borrow))//为真跳出循环
		{
			break;
		}
	}
	while (1)
	{
		InputBox(LibraryArry[NowBookNums].exist, 20, "请输入需要录入的图书馆藏数为:");//显示一个输入框,
		if (BookFormat(LibraryArry[NowBookNums].exist))//为真跳出循环
		{
			break;
		}
	}
	SaveInfor();
}
//判断输入的图书名字格式是否正确
bool BookFormat(char PerStr[])
{
	return true;
}
//文件读入后bool值返回真让循环跳出
//保存数据到文件中
void SaveInfor()
{
	if (strlen(LibraryArry[NowBookNums].title) != 0 && strlen(LibraryArry[NowBookNums].author) != 0 )
	{
		fstream myFile;
		myFile.open("BookList.txt", ios::app);  // append,追加
		myFile << LibraryArry[NowBookNums].title<<" "
			<< LibraryArry[NowBookNums].author << " "
			<<LibraryArry[NowBookNums].total<<" "
			<<LibraryArry[NowBookNums].borrow << " "
			<<LibraryArry[NowBookNums].exist << endl;
		myFile.close();
		NowBookNums++;//录入完毕,记录数加一
	}
}
//抹除全部数据再保存——主要用于修改功能
void SaveInforModi()
{
	//先删掉,但是不将人数置空所以不能调用之前的删除函数
	fstream myFile;
	myFile.open("BookList.txt", ios::trunc );  //- 删除现有文件中的数据
	myFile.open("BookList.txt", ios::out);//写入
	for (int i = 0; i < NowBookNums; i++)
	{
		if (strlen(LibraryArry[i].title) != 0 && strlen(LibraryArry[i].author) != 0 ) 
		{

			myFile << LibraryArry[i].title<<" "
				<< LibraryArry[i].author<<" "
				<< LibraryArry[i].total<<" "
				<<LibraryArry[i].borrow<<" "
				<< LibraryArry[i].exist<<endl;
		}
	}
	myFile.close();
}
//读取文件中的信息,同步到结构体数组中
void ReadInfor()
{
	fstream myFile;
	myFile.open("BookList.txt", ios::in);  // 只读
	//将文件中的数据读取到当前的结构体数组中
	for (int i = 0; i < RecordNums; i++)
	{
		myFile >> LibraryArry[i].title
			>> LibraryArry[i].author
			>> LibraryArry[i].total
			>> LibraryArry[i].borrow
			>> LibraryArry[i].exist;
	}
	int FileBookNums = 0;//文件中的记录数
	for (int i = 0; i < RecordNums; i++)//最多读15本书,读入前先判断标题是否为空
	{
		if (strlen(LibraryArry[i].title) != 0)
		{
			NowBookNums = ++FileBookNums;//双自增
		}
	}
	myFile.close();
}
//增删改查界面
void AdDeSeMoPage()
{
	BeginBatchDraw();
	initgraph(760, 760);
	cleardevice();
	//定义鼠标操作
	MOUSEMSG SL;

	cleardevice();
	IMAGE img_bk;
	loadimage(&img_bk, "BookListGround.jpg", 760, 760);
	putimage(0, 0, &img_bk);
	setbkmode(TRANSPARENT);

	setfillcolor(GREEN);
	setfillcolor(GREEN);
	fillrectangle(640, 90, 720, 140);//增加
	fillrectangle(640, 190, 720, 240);//删除
	fillrectangle(640, 290, 720, 340);//查找
	fillrectangle(640, 390, 720, 440);//修改
	fillrectangle(640, 490, 720, 540);//清空
	fillrectangle(640, 590, 720, 640);//返回

	//表头文字部分
	setbkmode(TRANSPARENT);
	settextstyle(30, 0, "黑体");
	outtextxy(0, 0, "图书名称");
	outtextxy(150, 0, "作者");
	outtextxy(300, 0, "图书总数");
	outtextxy(450, 0, "借出数");
	outtextxy(600, 0, "馆藏数");

	outtextxy(650, 30, "选项");
	outtextxy(650, 100, "添加");
	outtextxy(650, 200, "删除");
	outtextxy(650, 300, "查找");
	outtextxy(650, 400, "修改");
	outtextxy(650, 500, "清空");
	outtextxy(650, 600, "返回");
	EndBatchDraw();//执行未完成任务,并退出画图
	while (1)
	{
		SL = GetMouseMsg();
		if (SL.x >= 640 && SL.x <= 720 && SL.y >= 90 && SL.y <= 140)//增加
		{

			setlinecolor(RED);
			rectangle(640, 90, 720, 140);
			if (SL.uMsg == WM_LBUTTONDOWN)
			{
				//添加
				InputInfor();
				cleardevice();
				//完成操作重新载入——刷新
				AdDeSeMoPage();
			}
		}
		else if (SL.x >= 640 && SL.x <= 720 && SL.y >= 190 && SL.y <= 240)//删除
		{

			setlinecolor(RED);
			rectangle(640, 190, 720, 240);
			if (SL.uMsg == WM_LBUTTONDOWN)
			{
				DesignateBook();
				AdDeSeMoPage();
			}
		}
		else if (SL.x >= 640 && SL.x <= 720 && SL.y >= 290 && SL.y <= 340)//查找
		{

			setlinecolor(RED);
			rectangle(640, 290, 720, 340);
			if (SL.uMsg == WM_LBUTTONDOWN)//按下左键
			{
				FlagFPT = 1;
				PrintFoudInfor();
				AdDeSeMoPage();
			}
		}
		else if (SL.x >= 640 && SL.x <= 720 && SL.y >= 390 && SL.y <= 440)//修改
		{
			setlinecolor(RED);
			rectangle(640, 390, 720, 440);
			if (SL.uMsg == WM_LBUTTONDOWN)
			{
				ModifyBookInfor();
				AdDeSeMoPage();
			}
		}
		else if (SL.x >= 640 && SL.x <= 720 && SL.y >= 490 && SL.y <= 540)//清空
		{
			setlinecolor(RED);
			rectangle(640, 490, 720, 540);
			if (SL.uMsg == WM_LBUTTONDOWN)
			{
				//确保误删——弹窗加以提示
				HWND hwndDel = GetHWnd();
				int isok = MessageBox(hwndDel, "确认清空?", "提示", MB_OKCANCEL);
				if (isok == IDOK)
				{
					DeleteBookInfor();
					AdDeSeMoPage();
				}
				else if (isok == IDCANCEL)
				{
					//点击取消不做反应
				}
			}
		}
		else if (SL.x >= 640 && SL.x <= 720 && SL.y >= 590 && SL.y <= 640)//返回
		{
			//返回
			setlinecolor(RED);
			rectangle(640, 590, 720, 640);
			if (SL.uMsg == WM_LBUTTONDOWN)
			{
				cleardevice();
				//完成操作重新载入——刷新
				AdminPage();
			}
		}

		//鼠标不悬停
		else
		{
			setlinecolor(WHITE);
			rectangle(640, 90, 720, 140);//增
			rectangle(640, 190, 720, 240);//删
			rectangle(640, 290, 720, 340);//查
			rectangle(640, 390, 720, 440);//改
			rectangle(640, 490, 720, 540);//清
			rectangle(640, 590, 720, 640);//返
		}
	}
}
void SimplePrint()
{
	//Null的话结束
	if (NowBookNums == 0)
	{
		settextstyle(50, 0, "黑体");
		outtextxy(200, 200, "当前记录为空!");
		return;
	}
	for (int i = 1; i <= NowBookNums; i++)
	{


		//顺序
		settextstyle(30, 0, "黑体");
		char Nums[5];
		sprintf(Nums, "%d", i);
		//缩放字体
		settextstyle(25, 0, "黑体");
		outtextxy(0, 40 + 40 * i, LibraryArry[i - 1].title);//输出书名
		outtextxy(150, 40 + 40 * i, LibraryArry[i - 1].author);//作者
		outtextxy(300, 40 + 40 * i, LibraryArry[i - 1].total);//总数
		outtextxy(450, 40 + 40 * i, LibraryArry[i - 1].borrow);//借出
		outtextxy(600, 40 + 40 * i, LibraryArry[i - 1].exist);//现存
	}
}
//显示所有数据
void ShowAllInfor()
{
	BeginBatchDraw();
	//这个函数用于开始批量绘图。执行后,任何绘图操作都将暂时不输出到绘图窗口上
	//直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。
	initgraph(760, 760);
	cleardevice();
	//定义第三个鼠标操作
	MOUSEMSG SA;

	cleardevice();
	IMAGE img_bk;
	loadimage(&img_bk, "BookListGround.jpg", 760, 760);//书本数据的界面
	putimage(0, 0, &img_bk);
	setbkmode(TRANSPARENT);
	setfillcolor(GREEN);
	fillrectangle(640, 590, 720, 640);
	settextstyle(30, 0, "黑体");
	outtextxy(0, 0, "图书名称");
	outtextxy(150, 0, "作者");
	outtextxy(300, 0, "图书总数");
	outtextxy(450, 0, "借出数");
	outtextxy(600, 0, "馆藏数");
	outtextxy(650, 600, "返回");
	SimplePrint();//打印
	EndBatchDraw();
	while (1)
	{
		SA = GetMouseMsg();
		if (SA.x >= 640 && SA.x <= 720 && SA.y >= 590 && SA.y <= 640)
		{
			//返回
			setlinecolor(RED);
			rectangle(640, 590, 720, 640);
			if (SA.uMsg == WM_LBUTTONDOWN)
			{
				cleardevice();
				if (FlagAI == -1)
				{
					AdminPage();//-1就是管理员界面
				}
				if (FlagAI == 1)
				{
					CommonUserPage();//1就是普通用户界面
				}
			}
		}
	}
}
//返回要查找、修改、删除人所在的结构体的下标
int ReturnPosition()
{
	//接受用户输入
	char ReceInput[64];
	InputBox(ReceInput, 10, "请输入书名或者作者名进行操作");//显示一个输入框
	//进行循环查找,一旦相同就跳出循环
	for (int i = 0; i < NowBookNums; i++)
	{
		if (strcmp(LibraryArry[i].title, ReceInput) == 0 || strcmp(LibraryArry[i].author, ReceInput) == 0)//返回0表示两个字符串相等
		{
			return i;
		}
	}
	//如果没找到就返回-1
	return -1;
}
int RePosition()//借阅结构体下标,返回一个int整形数;
{
	//接受用户输入
	char ReceInput[64];
	InputBox(ReceInput, 10, "请输入书名或者作者名进行操作");//显示一个输入框
	for (int w = 0; w < RecordNums; w++)//进行循环查找,一旦相同就跳出循环
	{
		if (strcmp(LibraryArry[w].title, ReceInput) == 0 || strcmp(LibraryArry[w].author, ReceInput) == 0)//返回0表示两个字符串相等
		{
			return w;
		}
		//strcmp用法:
		/*该函数返回值如下:
如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。*/
	}
	//如果没找到就返回-1
	return -1;
}
//打印找到的信息
void PrintFoudInfor(int Position)
{
	BeginBatchDraw();//批量绘图
	initgraph(760, 760);
	cleardevice();//使用当前背景色清空
	//定义第三个鼠标操作
	MOUSEMSG PFI;
	cleardevice();
	IMAGE img_bk;
	loadimage(&img_bk, "BookListGround.jpg", 760, 760);
	putimage(0, 0, &img_bk);
	setbkmode(TRANSPARENT);
	setfillcolor(GREEN);
	fillrectangle(640, 590, 720, 640);//
	settextstyle(30, 0, "黑体");
	outtextxy(0, 0, "图书名称");
	outtextxy(150, 0, "作者");
	outtextxy(300, 0, "总数");
	outtextxy(450, 0, "借出");
	outtextxy(600, 0, "馆藏");
	outtextxy(650, 600, "返回");
	//打印找到的信息
	outtextxy(0, 80, LibraryArry[Position].title);//输出书名
	outtextxy(150, 80, LibraryArry[Position].author);
	outtextxy(300, 80, LibraryArry[Position].total);
	outtextxy(450, 80, LibraryArry[Position].borrow);
	outtextxy(600, 80, LibraryArry[Position].exist);
	FlushBatchDraw();
	EndBatchDraw();
	while (1)
	{
		PFI = GetMouseMsg();
		if (PFI.x >= 640 && PFI.x <= 720 && PFI.y >= 590 && PFI.y <= 640)
		{
			//返回
			setlinecolor(RED);
			rectangle(640, 590, 720, 640);
			if (PFI.uMsg == WM_LBUTTONDOWN)
			{
				cleardevice();
				if (FlagFPT == 1)
				{
					AdDeSeMoPage();
				}
				else if (FlagFPT == -1)
				{
					CommonUserPage();
				}
			}
		}
		else
		{
			setlinecolor(WHITE);
			rectangle(640, 590, 720, 640);
		}
	}
}
//最终负责查询调用的函数
void PrintFoudInfor()
{
	//定义一个变量用来接收下标
	int TempPosi = ReturnPosition();//-1是没找到的返回值
	if (TempPosi == -1)//没找到
	{
		//获取窗口句柄
		HWND hndtipsF = GetHWnd();
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsF, "系统未录入此图书!", "提示", MB_OK);
	}
	else//找到了——打印输出
	{
		cleardevice();
		PrintFoudInfor(TempPosi);
	}
}
//修改信息,找到返回下标,重新给他赋值,保存,否则直接弹窗警告
void ModifyBookInfor()
{
	//直接套用上面查找的操作,在此基础上加一行修改前
	//因为需要得到要修改人在结构体数组中的位置-下标,所以不能将函数直接拿过来用,得粘贴过来
	//定义一个变量用来接收下标
	int TempModi = ReturnPosition();
	if (TempModi == -1)//没找到
	{
		//获取窗口句柄
		HWND hndtipsM = GetHWnd();
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsM, "抱歉,没有这本书!", "提示", MB_OK);
	}
	else//找到了这本书进行下面的操作
	{
		BeginBatchDraw();
		initgraph(760, 760);
		cleardevice();
		//定义第三个鼠标操作
		MOUSEMSG Modi;
		cleardevice();
		IMAGE img_bk;
		loadimage(&img_bk, "BookListGround.jpg", 760, 760);
		putimage(0, 0, &img_bk);
		setbkmode(TRANSPARENT);
		setfillcolor(GREEN);
		fillrectangle(640, 590, 720, 640);
		settextstyle(50, 0, "黑体");
		outtextxy(0, 0, "修改前");
		outtextxy(0, 350, "修改后");
		settextstyle(30, 0, "黑体");
		outtextxy(0, 70, "图书名称");
		outtextxy(150, 70, "作者");
		outtextxy(300, 70, "总数");
		outtextxy(450, 70, "借出");
		outtextxy(600, 70, "馆藏");
		outtextxy(650, 600, "返回");
		//修改后
		outtextxy(0, 70, "图书名称");
		outtextxy(150, 70, "作者");
		outtextxy(300, 70, "总数");
		outtextxy(450, 70, "借出");
		outtextxy(600, 70, "馆藏");
		outtextxy(650, 600, "返回");
		//打印找到的信息
		outtextxy(0, 110, LibraryArry[TempModi].title);//输出书名
		outtextxy(150, 110, LibraryArry[TempModi].author);
		outtextxy(300, 110, LibraryArry[TempModi].total);//输出总数
		outtextxy(450, 110, LibraryArry[TempModi].borrow);//输出借出数
		outtextxy(600, 110, LibraryArry[TempModi].exist);//输出存量
		EndBatchDraw();
		while (1)
		{
			//接收输入的修改后的值覆盖进去
			char TempModiNums[64];
			InputBox(LibraryArry[TempModi].title, 20, "请输入修改后的书名");
			if (BookFormat(LibraryArry[TempModi].title))
			{
				break;
			}
		}
		while (1)
		{
			//接收输入的修改后的值覆盖进去
			char TempModiNums[64];
			InputBox(LibraryArry[TempModi].author, 20, "请输入修改后的作者名");
			if (BookFormat(LibraryArry[TempModi].author))
			{
				break;
			}
		}
		while (1)
		{
			//接收输入的修改后的值覆盖进去
			char TempModiNums[64];
			InputBox(LibraryArry[TempModi].total, 20, "请输入修改后的图书总数");
			if (BookFormat(LibraryArry[TempModi].total))
			{
				break;
			}
		}
		while (1)
		{
			//接收输入的修改后的值覆盖进去
			char TempModiNums[64];
			InputBox(LibraryArry[TempModi].borrow, 20, "请输入修改后的借出数");
			if (BookFormat(LibraryArry[TempModi].borrow))
			{
				break;
			}
		}
		while (1)
		{
			//接收输入的修改后的值覆盖进去
			char TempModiNums[64];
			InputBox(LibraryArry[TempModi].exist, 20, "请输入修改后的馆藏数");
			if (BookFormat(LibraryArry[TempModi].exist))
			{
				break;
			}
		}
		outtextxy(0, 410, LibraryArry[TempModi].title);//输出书名
		outtextxy(150, 410, LibraryArry[TempModi].author);
		outtextxy(300, 410, LibraryArry[TempModi].total);
		outtextxy(450, 410, LibraryArry[TempModi].borrow);
		outtextxy(600, 410, LibraryArry[TempModi].exist);
		SaveInforModi();
	}
}
//删除指定图书信息
void DesignateBook()
{
	//先查找,找到返回下标,删除后下标后的数据前移,NowBookNums--
	//查不到就查无此人
	//定义一个变量来接收下标
	int TempDelt = ReturnPosition();
	if (TempDelt == -1)//没找到
	{
		HWND hndtipsD = GetHWnd();//获取窗口句柄
		int isok = MessageBox(hndtipsD, "没有这本书的图书信息!", "提示", MB_OK);
	}
	else
	{
		//找到了就提示是否确定删除
		//获取窗口句柄
		HWND hndtipsDS = GetHWnd();
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsDS, "确定删除?", "提示", MB_OKCANCEL);
		if (isok == IDOK)
		{
			//确定删除操作
			//将这个元素的后一个依次迁移
			for (int d = TempDelt; d < NowBookNums; d++)
			{
				LibraryArry[d] = LibraryArry[d + 1];
			}
			//现在的人数-1
			NowBookNums--;
			//删除完成只是将当前结构体里面的数据清除了,但是文件中并没有作出更改
			//更新到文件中
			SaveInforModi();//用这个全部清空的函数,再对文件进行重写
		}
		else if (isok == IDCANCEL)
		{
			//取消删除不执行任何操作
		}
	}
}
//图书信息借阅,归还界面
void BorrowReturnPage()
{
	initgraph(760, 760);
	cleardevice();
	//定义第三个鼠标操作
	MOUSEMSG m3;
	cleardevice();
	BeginBatchDraw();
	IMAGE img_bk;
	loadimage(&img_bk, "admin.jpg", 760, 760);
	putimage(0, 0, &img_bk);
	setbkmode(TRANSPARENT);
	setfillcolor(GREEN);
	setbkmode(TRANSPARENT);
	//两个选项的背景
	fillrectangle(230, 300, 560, 350);
	fillrectangle(230, 450, 560, 500);
	fillrectangle(230, 600, 560, 650);
	setbkmode(TRANSPARENT);
	//三个选项的文字
	settextstyle(30, 0, "黑体");
	//三个选项
	outtextxy(320, 310, "借阅图书");
	outtextxy(320, 460, "归还图书");
	outtextxy(350, 610, "返回");
	EndBatchDraw();
	//进入主界面选项操作界面
	while (1)
	{
		m3 = GetMouseMsg();//获取鼠标操作
		if (m3.x >= 230 && m3.x <= 560 && m3.y >= 300 && m3.y <= 350)//借阅
		{
			setlinecolor(RED);
			rectangle(230, 300, 560, 350);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				BorrowBook();
			}
		}
		else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 450 && m3.y <= 500)//归还
		{
			setlinecolor(RED);
			rectangle(230, 450, 560, 500);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				ReturnBook();
			}
		}
		else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 600 && m3.y <= 650)//选项4——返回
		{
			setlinecolor(RED);
			rectangle(230, 600, 560, 650);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				cleardevice();
				CommonUserPage();
			}
		}
		//鼠标不在上面悬停
		else
		{
			setlinecolor(WHITE);
			rectangle(230, 300, 560, 350);
			rectangle(230, 450, 560, 500);
			rectangle(230, 600, 560, 650);
		}
	}
}
//图书借阅
void BorrowBook()
{
	//定义一个变量用来接收下标
	int TempBorr = ReturnPosition();
	if (TempBorr == -1|| LibraryArry[TempBorr].exist[0] == '0')//没找到
	{
		//获取窗口句柄
		HWND hndtipsF = GetHWnd();
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsF, "无法借阅!", "提示", MB_OK);
	}
	else//找到了——将借阅出去的图书信息存储到另一个文件中,归还时重新读入
	{
		if (strlen(LibraryArry[TempBorr].title) != 0 && strlen(LibraryArry[TempBorr].author) != 0)
		{
			fstream myFile;
			myFile.open("Borrow.txt", ios::app);  // append,追加
			LibraryArry[TempBorr].borrow[0] += 1;
			LibraryArry[TempBorr].exist[0] -= 1;
			myFile << LibraryArry[TempBorr].title <<" "
			<< LibraryArry[TempBorr].author<<" "
			<< LibraryArry[TempBorr].total <<" "
			<< LibraryArry[TempBorr].borrow << " " 
			<< LibraryArry[TempBorr].exist <<endl;
			myFile.close();//关闭文件
		}
		SaveInforModi();
		HWND hndtipsF = GetHWnd();
		int isok = MessageBox(hndtipsF, "借阅成功", "提示", MB_OK);
	}
}
//归还图书
void ReturnBook()
{
	int TempBorr = RePosition();
	if (TempBorr == -1|| LibraryArry[TempBorr].borrow[0]=='0')//没找到
	{
		//获取窗口句柄
		HWND hndtipsF = GetHWnd();//获得窗口句柄
		//在 Windows 下,句柄是一个窗口的标识
		//得到句柄后,可以使用 Windows API 中的函数实现对窗口的控制。
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsF, "归还失败!", "提示", MB_OK);
	}
	else//找到了——将借阅出去的图书信息存储到另一个文件中,归还时重新读入
	{
		LibraryArry[TempBorr].borrow[0] -=1;
		LibraryArry[TempBorr].exist[0] += 1;
		fstream myFile;
		//myFile.open("BookList.txt", ios::trunc);  //- 删除现有文件中的数据
		myFile.open("BookList.txt", ios::out);//写入
		for (int i = 0; i < RecordNums; i++)
		{
			if (strlen(LibraryArry[i].title) != 0 && strlen(LibraryArry[i].author) != 0 )
			{
				myFile << LibraryArry[i].title << " "
					<< LibraryArry[i].author << " "
					<< LibraryArry[i].total << " "
					<< LibraryArry[i].borrow << " "
					<< LibraryArry[i].exist << endl;
			}
		}
		myFile.close();
		HWND hndtipsF = GetHWnd();
		int isok = MessageBox(hndtipsF, "归还成功", "提示", MB_OK);
	}
}
//彻底清空,删除文件
void DeleteBookInfor()
{
	remove("BookList.txt");
	//置空当前纪录信息数
	NowBookNums = 0;
}
//管理员登录
void AdminSignIn()
{
	ifstream  AdminSignIn;
	AdminSignIn.open("AdminSignIn.txt", ios::in);
	AdminSignIn >> AdminUser.UserName >> AdminUser.PassWord;	
	AdminSignIn.close();// 关闭文件
	char ReceAcctNumber[64];
	InputBox(ReceAcctNumber, 10, "请输入用户名");
	char ReceAcctPassWord[64];
	InputBox(ReceAcctPassWord, 10, "请输入密码");
	//如果用户名和密码都正确才进度到管理员界面
	//否则弹窗提示错误
	if (strcmp(AdminUser.UserName, ReceAcctNumber) == 0 && strcmp(AdminUser.PassWord, ReceAcctPassWord) == 0)
	{
		cleardevice();//清屏
		AdminPage();
	}
	else
	{
		HWND SignError = GetHWnd();//这个函数用于获取绘图窗口句柄。
		int isok = MessageBox(SignError, "用户名或密码错误!", "提示", MB_OK);
	}
}


 //由于比较懒,所有书籍只能存放个位数的书,不然会出错,一个简单的系统不整太多花的

//没有实现拼音排序的功能,不是很清楚这个要怎么做;

//目前仍在迭代,到周四晚上答辩可能会有所更新

//感谢王同学,朱同学,赵同学的合作与交流

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏破楼兰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值