图书管理系统

目录

项目的大致思路

实现的功能

项目的逐步实现

项目的总代码


用EasyX图形库写的第一个小项目。

项目的大致思路

实现的功能

管理员

查看所有图书信息

修改图书信息

删除图书信息

新增图书信息

用户

查看所有图书信息

查找图书

借阅图书

归还图书

项目的逐步实现

  1. 创建结构体储存数据
    //定义一个存储图书信息的结构体
    //定义数组存储所有图书信息
    typedef struct
    {
    	char title[1000];//书名
    	char author[1000];//作者
    	char totalnum[1000];//图书总数
    	char borrownum[1000];//图书借阅数
    }Book;
    Book books[MAXSIZE];
    
    //定义一个存储借阅图书信息的结构体
    //定义数组存储所有图书信息
    typedef struct
    {
    	char title[1000];//书名
    	char author[1000];//作者
    }BoBook;
    BoBook bobooks[MAXSIZE];
    
    //定义一个存储归还图书信息的结构体
    //定义数组存储所有图书信息
    typedef struct
    {
    	char title[1000];//书名
    	char author[1000];//作者
    }ReBook;
    ReBook rebooks[MAXSIZE];
    
    //定义管理员结构体
    //为了方便只设置一个管理员
    typedef struct
    {
    	char name[200];
    	char code[200];
    }Manager;
    Manager managers;
    
    //定义用户结构体
    //为了方便只设置一个用户
    typedef struct
    {
    	char name[200];
    	char code[200];
    }User;
    User users;
  2. 设置首页画面,功能有管理员操作页面以及用户操作页面
    void FirstPage()
    {
    	initgraph(1170, 869);
    	IMAGE img_bk;
    	loadimage(&img_bk, "./bk1.jpg");
    	cleardevice();//清屏
    	BeginBatchDraw();//开始批量绘图
    	putimage(0, 0, &img_bk);//展示背景图片
    	setbkmode(TRANSPARENT);//设置背景模式透明
    
    	//大标题
    	char FirstTitle[20] = { "图书管理系统" };
    	settextstyle(80, 0, "华文行楷");
    	outtextxy(350, 50, FirstTitle);
    	//首页的三个选项
    	setfillcolor(RGB(255, 197, 110));
    	fillrectangle(380, 300, 800, 350);
    	fillrectangle(380, 380, 800, 430);
    	fillrectangle(380, 460, 800, 510);
    
    	//三个选项的文字
    	settextcolor(BLACK);
    	settextstyle(40, 0, "隶书");
    	//首页三个选项
    	char FirstSelect1[20] = { "管理员操作界面" };
    	char FirstSelect2[20] = { "用户操作界面" };
    	char FirstSelect3[20] = { "退出系统" };
    	outtextxy(395, 305, FirstSelect1);
    	outtextxy(395, 385, FirstSelect2);
    	outtextxy(395, 465, FirstSelect3);
    
    	FlushBatchDraw();
    	EndBatchDraw();
    
    	//鼠标操作
    	MOUSEMSG m1;
    	//进入主界面选项操作
    	while (1)
    	{
    		m1 = GetMouseMsg();//获取鼠标操作
    		if (m1.x >= 380 && m1.x <= 800 && m1.y >= 300 && m1.y <= 350)//管理员界面
    		{
    			setlinecolor(RED);
    			rectangle(380, 300, 800, 350);
    			if (m1.uMsg == WM_LBUTTONDOWN)
    			{
    				ManagerSignIn();
    			}
    		}
    		else if (m1.x >= 380 && m1.x <= 800 && m1.y >= 380 && m1.y <= 430)//用户界面
    		{
    			setlinecolor(RED);
    			rectangle(380, 380, 800, 430);
    			if (m1.uMsg == WM_LBUTTONDOWN)
    			{
    				ReSiPage();
    			}
    		}
    		else if (m1.x >= 380 && m1.x <= 800 && m1.y >= 460 && m1.y <= 510)
    		{
    			setlinecolor(RED);
    			rectangle(380, 460, 800, 510);
    			if (m1.uMsg == WM_LBUTTONDOWN)
    			{
    				exit(0);
    			}
    		}
    		//鼠标不在上面悬停
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(380, 300, 800, 350);
    			rectangle(380, 380, 800, 430);
    			rectangle(380, 460, 800, 510);
    		}
    	}
    }

    完成首页设计之后,后面的页面基本可以copy一样的。我设置了三种不同的背景板,让原本简陋的项目看起来高级一点

  3. 再继续实现首页的两个功能,首先是管理员登录

    void ManagerSignIn()
    {
    	ifstream  AdminSignIn;
    	AdminSignIn.open("ManagerSignIn.txt", ios::in);
    	AdminSignIn >> managers.name >> managers.code;
    	AdminSignIn.close();// 关闭文件
    	char ReceAcctNumber[1000];
    	InputBox(ReceAcctNumber, 1000, "请输入用户名");
    	char ReceAcctPassWord[1000];
    	InputBox(ReceAcctPassWord, 1000, "请输入密码");
    	//如果用户名和密码都正确才进度到管理员界面
    	//否则弹窗提示错误
    	if (strcmp(managers.name, ReceAcctNumber) == 0 && strcmp(managers.code, ReceAcctPassWord) == 0)
    	{
    		cleardevice();//清屏
    		ManagerPage();
    	}
    	else
    	{
    		HWND SignError = GetHWnd();//这个函数用于获取绘图窗口句柄。
    		int isok = MessageBox(SignError, "用户名或密码错误!", "提示", MB_OK);
    	}
    }

    自创一个ManagerSignIn.txt文本,记录管理员的名字与密码。不知道为什么管理员名字记录为中文会出错,所以为了避免这个错误,我不用中文。在答辩前半个小时,我突然发现只需要把我定义的管理员数组开大一点,就不会出现这样的错误了。再是用户的注册和登录界面

    void ReSiPage()
    {
    	initgraph(1170, 869);
    	IMAGE img_bk;
    	loadimage(&img_bk, "./bk3.jpg");
    	cleardevice();//清屏
    	BeginBatchDraw();//开始批量绘图
    	putimage(0, 0, &img_bk);//展示背景图片
    	setbkmode(TRANSPARENT);//设置背景模式透明
    
    	//标题
    	char SecondTitle[20] = "用户注册或登录界面";
    	settextstyle(40, 0, "华文行楷");
    	outtextxy(0, 0, SecondTitle);
    
    	//三个选项的背景
    	setfillcolor(RGB(191, 149, 214));
    	fillrectangle(380, 300, 800, 350);
    	fillrectangle(380, 380, 800, 430);
    	fillrectangle(380, 460, 800, 510);
    
    	//三个选项的文字
    	settextcolor(BLACK);
    	settextstyle(40, 0, "隶书");
    	//首页三个选项
    	char SecondSelect1[20] = { "注册" };
    	char SecondSelect2[20] = { "登录" };
    	char SecondSelect6[20] = { "返回" };
    	outtextxy(395, 305, SecondSelect1);
    	outtextxy(395, 385, SecondSelect2);
    	outtextxy(395, 465, SecondSelect6);
    
    	FlushBatchDraw();
    	EndBatchDraw();
    
    	//定义第三个鼠标操作
    	MOUSEMSG m3;
    	//进入主界面选项操作界面
    	while (1)
    	{
    		m3 = GetMouseMsg();//获取鼠标操作
    		if (m3.x >= 380 && m3.x <= 800 && m3.y >= 300 && m3.y <= 350)//注册
    		{
    			setlinecolor(RED);
    			rectangle(380, 300, 800, 350);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				UserRegister();
    			}
    		}
    		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 380 && m3.y <= 430)//登录
    		{
    			setlinecolor(RED);
    			rectangle(380, 380, 800, 430);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				UserSignIn();
    			}
    		}
    		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 460 && m3.y <= 510)//借
    		{
    			setlinecolor(RED);
    			rectangle(380, 460, 800, 510);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				//返回
    				cleardevice();
    				FirstPage();
    			}
    		}
    		//鼠标不在上面悬停
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(380, 300, 800, 350);
    			rectangle(380, 380, 800, 430);
    			rectangle(380, 460, 800, 510);
    		}
    	}
    }

    点击进入用户的注册

    void UserRegister()
    {
    	while (1)
    	{
    		InputBox(users.name, 20, "请输入注册用户名称:");//显示一个输入框,
    		if (BookFormat(users.name))//为真跳出循环
    		{
    			break;
    		}
    	}
    	while (1)
    	{
    		InputBox(users.code, 20, "请输入注册用户的密码:");//显示一个输入框,
    		if (BookFormat(users.code))//为真跳出循环
    		{
    			break;
    		}
    	}
    
    	if (strlen(users.name) != 0 && strlen(users.code) != 0)
    	{
    		fstream myFile;
    		myFile.open("UserSignIn.txt", ios::app);  // append,追加
    		myFile << users.name << " "
    			<< users.code << endl;
    		myFile.close();
    	}
    
    	ReSiPage();
    }

    把输入的信息存储进入UserSignIn.txt文本,然后返回注册和登录界面,进行登录

    void UserSignIn()
    {
    	ifstream UserSignIn;
    	UserSignIn.open("UserSignIn.txt", ios::in);
    	UserSignIn >> users.name >> users.code;
    	UserSignIn.close();// 关闭文件
    	char ReceAcctNumber[64];
    	InputBox(ReceAcctNumber, 10, "请输入用户名");
    	char ReceAcctPassWord[64];
    	InputBox(ReceAcctPassWord, 10, "请输入密码");
    	//如果用户名和密码都正确才进度到管理员界面
    	//否则弹窗提示错误
    	if (strcmp(users.name, ReceAcctNumber) == 0 && strcmp(users.code, ReceAcctPassWord) == 0)
    	{
    		cleardevice();//清屏
    		UserPage();
    	}
    	else
    	{
    		HWND SignError = GetHWnd();//这个函数用于获取绘图窗口句柄。
    		int isok = MessageBox(SignError, "用户名或密码错误!", "提示", MB_OK);
    	}
    }

    登录成功就直接进入用户界面咯,为了偷懒,我只设置了一个用户啊哈哈。

  4. 先来实现管理员的基本操作,首先是管理员的操作界面

    void ManagerPage()
    {
    	initgraph(1170, 869);
    	IMAGE img_bk;
    	loadimage(&img_bk, "./bk2.jpg");
    	cleardevice();//清屏
    	BeginBatchDraw();//开始批量绘图
    	putimage(0, 0, &img_bk);//展示背景图片
    	setbkmode(TRANSPARENT);//设置背景模式透明
    
    	//标题
    	char SecondTitle[20] = "管理员操作界面";
    	settextstyle(40, 0, "华文行楷");
    	outtextxy(0, 0, SecondTitle);
    
    	//三个选项的背景
    	setfillcolor(RGB(56, 242, 212));
    	fillrectangle(380, 300, 800, 350);
    	fillrectangle(380, 380, 800, 430);
    	fillrectangle(380, 460, 800, 510);
    	fillrectangle(380, 540, 800, 590);
    	fillrectangle(380, 620, 800, 670);
    
    	//三个选项的文字
    	settextcolor(BLACK);
    	settextstyle(40, 0, "隶书");
    	//首页三个选项
    	char SecondSelect1[20] = { "查看所有图书" };
    	char SecondSelect2[20] = { "修改图书信息" };
    	char SecondSelect3[20] = { "删除图书信息" };
    	char SecondSelect4[20] = { "增加图书信息" };
    	char SecondSelect5[20] = { "返回" };
    	outtextxy(395, 305, SecondSelect1);
    	outtextxy(395, 385, SecondSelect2);
    	outtextxy(395, 465, SecondSelect3);
    	outtextxy(395, 545, SecondSelect4);
    	outtextxy(395, 625, SecondSelect5);
    
    	FlushBatchDraw();
    	EndBatchDraw();
    
    	//定义第二个鼠标操作
    	MOUSEMSG m2;
    	//进入主界面选项操作界面
    	while (1)
    	{
    		m2 = GetMouseMsg();//获取鼠标操作
    		if (m2.x >= 380 && m2.x <= 800 && m2.y >= 300 && m2.y <= 350)//查
    		{
    			setlinecolor(RED);
    			rectangle(380, 300, 800, 350);
    			if (m2.uMsg == WM_LBUTTONDOWN)
    			{
    				cleardevice();
    				ViewAllBook1();
    			}
    		}
    		else if (m2.x >= 380 && m2.x <= 800 && m2.y >= 380 && m2.y <= 430)//改
    		{
    			setlinecolor(RED);
    			rectangle(380, 380, 800, 430);
    			if (m2.uMsg == WM_LBUTTONDOWN)
    			{
    				AlterBook();
    			}
    		}
    		else if (m2.x >= 380 && m2.x <= 800 && m2.y >= 460 && m2.y <= 510)//删
    		{
    			setlinecolor(RED);
    			rectangle(380, 460, 800, 510);
    			if (m2.uMsg == WM_LBUTTONDOWN)
    			{
    				DeleteBook();
    			}
    		}
    		else if (m2.x >= 380 && m2.x <= 800 && m2.y >= 540 && m2.y <= 590)//增
    		{
    			setlinecolor(RED);
    			rectangle(380, 540, 800, 590);
    			if (m2.uMsg == WM_LBUTTONDOWN)
    			{
    				AddBook();
    			}
    		}
    		else if (m2.x >= 380 && m2.x <= 800 && m2.y >= 620 && m2.y <= 670)
    		{
    			setlinecolor(RED);
    			rectangle(380, 620, 800, 670);
    			if (m2.uMsg == WM_LBUTTONDOWN)
    			{
    				//返回
    				cleardevice();
    				FirstPage();
    			}
    		}
    		//鼠标不在上面悬停
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(380, 300, 800, 350);
    			rectangle(380, 380, 800, 430);
    			rectangle(380, 460, 800, 510);
    			rectangle(380, 540, 800, 590);
    			rectangle(380, 620, 800, 670);
    		}
    	}
    }

    每一次运行代码,界面切换只有第一次切换的时候会不流畅,其他时候挺好的,再进入四大功能,查看所有数据

    void ViewAllBook1()
    {
    	initgraph(1170, 869);
    	IMAGE img_bk;
    	loadimage(&img_bk, "./bk2.jpg");
    	cleardevice();//清屏
    	BeginBatchDraw();//开始批量绘图
    	putimage(0, 0, &img_bk);//展示背景图片
    	setbkmode(TRANSPARENT);//设置背景模式透明
    
    	//标题
    	char SecondTitle[20] = "查看所有图书";
    	settextstyle(35, 0, "华文行楷");
    	outtextxy(0, 0, SecondTitle);
    
    	settextstyle(30, 0, "隶书");
    	settextcolor(BLACK);
    	outtextxy(150, 30, "图书名称");
    	outtextxy(450, 30, "作者");
    	outtextxy(680, 30, "图书总数");
    	outtextxy(900, 30, "图书借阅数");
    	PrintfBook();
    
    	setfillcolor(RGB(56, 242, 212));
    	fillrectangle(380, 700, 800, 750);
    	settextcolor(BLACK);
    	settextstyle(40, 0, "隶书");
    	char SecondSelect5[20] = { "返回" };
    	outtextxy(395, 705, SecondSelect5);
    
    	FlushBatchDraw();
    	EndBatchDraw();
    
    	MOUSEMSG m4;
    	while (1)
    	{
    		m4 = GetMouseMsg();
    		if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
    		{
    			setlinecolor(RED);
    			rectangle(380, 700, 800, 750);
    			if (m4.uMsg == WM_LBUTTONDOWN)
    			{
    				//返回
    				ManagerPage();
    			}
    		}
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(380, 700, 800, 750);
    		}
    	}
    }
    //打印函数
    void PrintfBook()
    {
    	if (BookNum == 0)
    	{
    		settextstyle(50, 0, "隶书");
    		outtextxy(200, 200, "当前记录为空!");
    		return;
    	}
    	for (int i = 1; i <= BookNum; i++)
    	{
    		//缩放字体
    		settextstyle(25, 0, "隶书");
    		outtextxy(150, 40 + 40 * i, books[i - 1].title);//输出书名
    		outtextxy(450, 40 + 40 * i, books[i - 1].author);//作者
    		outtextxy(680, 40 + 40 * i, books[i - 1].totalnum);//图书总数
    		outtextxy(900, 40 + 40 * i, books[i - 1].borrownum);//借阅数
    	}
    }

    我只输出了一面的内容,没有实现翻页功能,因为本来就不会写,所以越简单越好吧

    //返回要查找、修改、删除人所在的结构体的下标
    int ReturnPosition()
    {
    	//接受用户输入
    	char ReceInput[200];
    	InputBox(ReceInput, 100, "请输入书名或者作者名进行操作");//显示一个输入框
    	//进行循环查找,一旦相同就跳出循环
    	for (int i = 0; i < BookNum; i++)
    	{
    		if (strcmp(books[i].title, ReceInput) == 0 || strcmp(books[i].author, ReceInput) == 0)//返回0表示两个字符串相等
    		{
    			return i;
    		}
    	}
    	//如果没找到就返回-1
    	return -1;
    }
    //保存修改后的数据
    void SaveAlter()
    {
    	//先删掉,但是不将人数置空所以不能调用之前的删除函数
    	fstream myFile;
    	myFile.open("data.txt", ios::trunc);  //- 删除现有文件中的数据
    	myFile.open("data.txt", ios::out);//写入
    	for (int i = 0; i < BookNum; i++)
    	{
    		if (strlen(books[i].title) != 0 && strlen(books[i].author) != 0)
    		{
    
    			myFile << books[i].title << " "
    				<< books[i].author << " "
    				<< books[i].totalnum << ""
    				<< books[i].borrownum << endl;
    		}
    	}
    	myFile.close();
    }
    void AlterBook()//改
    {
    	//直接套用上面查找的操作,在此基础上加一行修改前
    	//因为需要得到要修改人在结构体数组中的位置-下标,所以不能将函数直接拿过来用,得粘贴过来
    	//定义一个变量用来接收下标
    	int TempModi = ReturnPosition();
    	if (TempModi == -1)//没找到
    	{
    		//获取窗口句柄
    		HWND hndtipsM = GetHWnd();
    		//用一个字符数组来总结句子
    		int isok = MessageBox(hndtipsM, "抱歉,没有这本书!", "提示", MB_OK);
    	}
    	else//找到了这本书进行下面的操作
    	{
    		cleardevice();
    		initgraph(1170, 869);
    		cleardevice();
    		BeginBatchDraw();
    
    		IMAGE img_bk;
    		loadimage(&img_bk, "./bk2.jpg");
    		putimage(0, 0, &img_bk);
    		setbkmode(TRANSPARENT);
    
    		//标题
    		char SecondTitle[20] = "修改图书信息";
    		settextstyle(35, 0, "华文行楷");
    		outtextxy(0, 0, SecondTitle);
    
    		settextcolor(BLACK);
    		settextstyle(50, 0, "隶书");
    		outtextxy(30, 30, "修改前");
    		outtextxy(30, 350, "修改后");
    
    		settextstyle(30, 0, "隶书");
    		outtextxy(60, 70, "图书名称");
    		outtextxy(400, 70, "作者");
    		outtextxy(650, 70, "图书总数");
    		outtextxy(800, 70, "借阅数");
    
    		//修改后
    		outtextxy(60, 390, "图书名称");
    		outtextxy(400, 390, "作者");
    		outtextxy(650, 390, "图书总数");
    		outtextxy(800, 390, "借阅数");
    
    		//打印找到的信息
    		outtextxy(60, 100, books[TempModi].title);//输出书名
    		outtextxy(400, 100, books[TempModi].author);//输出作者
    		outtextxy(650, 100, books[TempModi].totalnum);//输出图书总数
    		outtextxy(800, 100, books[TempModi].borrownum);//输出借阅数
    
    		setfillcolor(RGB(56, 242, 212));
    		fillrectangle(380, 700, 800, 750);
    		settextcolor(BLACK);
    		settextstyle(40, 0, "隶书");
    		char SecondSelect5[20] = { "返回" };
    		outtextxy(395, 705, SecondSelect5);
    
    		FlushBatchDraw();
    		EndBatchDraw();
    
    		while (1)
    		{
    			//接收输入的修改后的值覆盖进去
    			InputBox(books[TempModi].title, 20, "请输入修改后的书名");
    			if (BookFormat(books[TempModi].title))
    			{
    				break;
    			}
    		}
    		while (1)
    		{
    			//接收输入的修改后的值覆盖进去
    			InputBox(books[TempModi].author, 20, "请输入修改后的作者名");
    			if (BookFormat(books[TempModi].author))
    			{
    				break;
    			}
    		}
    		while (1)
    		{
    			//接收输入的修改后的值覆盖进去
    			InputBox(books[TempModi].totalnum, 20, "请输入修改后的出版社");
    			if (BookFormat(books[TempModi].totalnum))
    			{
    				break;
    			}
    		}
    		while (1)
    		{
    			//接收输入的修改后的值覆盖进去
    			InputBox(books[TempModi].borrownum, 20, "请输入修改后的作者名");
    			if (BookFormat(books[TempModi].borrownum))
    			{
    				break;
    			}
    		}
    
    		settextstyle(30, 0, "隶书");
    		outtextxy(60, 420, books[TempModi].title);//输出书名
    		outtextxy(400, 420, books[TempModi].author);
    		outtextxy(650, 420, books[TempModi].totalnum);
    		outtextxy(800, 420, books[TempModi].borrownum);
    		SaveAlter();
    
    		//定义第三个鼠标操作
    		MOUSEMSG m4;
    		while (1)
    		{
    			m4 = GetMouseMsg();
    			if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
    			{
    				setlinecolor(RED);
    				rectangle(380, 700, 800, 750);
    				if (m4.uMsg == WM_LBUTTONDOWN)
    				{
    					//返回
    					ManagerPage();
    				}
    			}
    			else
    			{
    				setlinecolor(WHITE);
    				rectangle(380, 700, 800, 750);
    			}
    		}
    
    	}
    }

    这个十分的繁琐,我并不想回顾,跳到删除

    void DeleteBook()//删
    {
    	//先查找,找到返回下标,删除后下标后的数据前移,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 < BookNum; d++)
    			{
    				books[d] = books[d + 1];
    			}
    			//现在的人数-1
    			BookNum--;
    			//删除完成只是将当前结构体里面的数据清除了,但是文件中并没有作出更改
    			//更新到文件中
    			SaveAlter();//用这个全部清空的函数,再对文件进行重写
    		}
    		else if (isok == IDCANCEL)
    		{
    			//取消删除不执行任何操作
    		}
    	}
    }

    相比于修改,删除简直不要太好做,虽然我是copy的。以及增加。

    void AddBook()
    {
    	while (1)
    	{
    		InputBox(books[BookNum].title, 20, "请输入需要录入的图书名称:");//显示一个输入框,
    		if (BookFormat(books[BookNum].title))//为真跳出循环
    		{
    			break;
    		}
    	}
    	while (1)
    	{
    		InputBox(books[BookNum].author, 20, "请输入需要录入的图书作者名称:");//显示一个输入框,
    		if (BookFormat(books[BookNum].author))//为真跳出循环
    		{
    			break;
    		}
    	}
    	while (1)
    	{
    		InputBox(books[BookNum].totalnum, 20, "请输入需要录入的图书总数为:");//显示一个输入框,
    		if (BookFormat(books[BookNum].totalnum))//为真跳出循环
    		{
    			break;
    		}
    	}
    	while (1)
    	{
    		InputBox(books[BookNum].borrownum, 20, "请输入需要录入的图书总数为:");//显示一个输入框,
    		if (BookFormat(books[BookNum].borrownum))//为真跳出循环
    		{
    			break;
    		}
    	}
    	SaveInfor();
    
    }
    void SaveInfor()
    {
    	if (strlen(books[BookNum].title) != 0 && strlen(books[BookNum].author) != 0)
    	{
    		fstream myFile;
    		myFile.open("data.txt", ios::app);  // append,追加
    		myFile << books[BookNum].title << " "
    			<< books[BookNum].author << " "
    			<< books[BookNum].totalnum << " "
    			<< books[BookNum].borrownum << endl;
    		myFile.close();
    		BookNum++;//录入完毕,记录数加一
    	}
    }

    类似于删除,只不过这个这个保存数据要总体进行全部重新输入

  5. 用户功能的实现,先来到用户界面

    void UserPage()
    {
    	initgraph(1170, 869);
    	IMAGE img_bk;
    	loadimage(&img_bk, "./bk3.jpg");
    	cleardevice();//清屏
    	BeginBatchDraw();//开始批量绘图
    	putimage(0, 0, &img_bk);//展示背景图片
    	setbkmode(TRANSPARENT);//设置背景模式透明
    
    	//标题
    	char SecondTitle[20] = "用户操作界面";
    	settextstyle(40, 0, "华文行楷");
    	outtextxy(0, 0, SecondTitle);
    
    	//三个选项的背景
    	setfillcolor(RGB(191, 149, 214));
    	fillrectangle(380, 300, 800, 350);
    	fillrectangle(380, 380, 800, 430);
    	fillrectangle(380, 460, 800, 510);
    	fillrectangle(380, 540, 800, 590);
    	fillrectangle(380, 620, 800, 670);
    	fillrectangle(380, 700, 800, 750);
    
    	//三个选项的文字
    	settextcolor(BLACK);
    	settextstyle(40, 0, "隶书");
    	//首页三个选项
    	char SecondSelect1[20] = { "查看所有图书" };
    	char SecondSelect2[20] = { "查找图书信息" };
    	char SecondSelect3[20] = { "借阅图书" };
    	char SecondSelect4[20] = { "归还图书" };
    	char SecondSelect5[20] = { "查看用户信息" };
    	char SecondSelect6[20] = { "返回" };
    	outtextxy(395, 305, SecondSelect1);
    	outtextxy(395, 385, SecondSelect2);
    	outtextxy(395, 465, SecondSelect3);
    	outtextxy(395, 545, SecondSelect4);
    	outtextxy(395, 625, SecondSelect5);
    	outtextxy(395, 705, SecondSelect6);
    
    	FlushBatchDraw();
    	EndBatchDraw();
    
    	//定义第三个鼠标操作
    	MOUSEMSG m3;
    	//进入主界面选项操作界面
    	while (1)
    	{
    		m3 = GetMouseMsg();//获取鼠标操作
    		if (m3.x >= 380 && m3.x <= 800 && m3.y >= 300 && m3.y <= 350)//查
    		{
    			setlinecolor(RED);
    			rectangle(380, 300, 800, 350);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				cleardevice();
    				ViewAllBook2();
    			}
    		}
    		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 380 && m3.y <= 430)//找
    		{
    			setlinecolor(RED);
    			rectangle(380, 380, 800, 430);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				FindBook();
    			}
    		}
    		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 460 && m3.y <= 510)//借
    		{
    			setlinecolor(RED);
    			rectangle(380, 460, 800, 510);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				BorrowBook();
    			}
    		}
    		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 540 && m3.y <= 590)//还
    		{
    			setlinecolor(RED);
    			rectangle(380, 540, 800, 590);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				ReturnBook();
    			}
    		}
    		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 620 && m3.y <= 670)
    		{
    			setlinecolor(RED);
    			rectangle(380, 620, 800, 670);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				cleardevice();
    				UserInforPage();
    			}
    		}
    		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 700 && m3.y <= 750)
    		{
    			setlinecolor(RED);
    			rectangle(380, 700, 800, 750);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				//返回
    				cleardevice();
    				FirstPage();
    			}
    		}
    		//鼠标不在上面悬停
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(380, 300, 800, 350);
    			rectangle(380, 380, 800, 430);
    			rectangle(380, 460, 800, 510);
    			rectangle(380, 540, 800, 590);
    			rectangle(380, 620, 800, 670);
    			rectangle(380, 700, 800, 750);
    		}
    	}
    }

    查看所有图书

    void ViewAllBook2()
    {
    	initgraph(1170, 869);
    	IMAGE img_bk;
    
    	loadimage(&img_bk, "./bk3.jpg");
    	cleardevice();//清屏
    	BeginBatchDraw();//开始批量绘图
    	putimage(0, 0, &img_bk);//展示背景图片
    	setbkmode(TRANSPARENT);//设置背景模式透明
    
    	//标题
    	char SecondTitle[20] = "查看所有图书";
    	settextstyle(35, 0, "华文行楷");
    	outtextxy(0, 0, SecondTitle);
    
    	settextstyle(30, 0, "隶书");
    	settextcolor(BLACK);
    	outtextxy(150, 30, "图书名称");
    	outtextxy(450, 30, "作者");
    	outtextxy(680, 30, "图书总数");
    	outtextxy(900, 30, "图书借阅数");
    	PrintfBook();
    
    
    	setfillcolor(RGB(191, 149, 214));
    	fillrectangle(380, 700, 800, 750);
    	settextcolor(BLACK);
    	settextstyle(40, 0, "隶书");
    	char SecondSelect5[20] = { "返回" };
    	outtextxy(395, 705, SecondSelect5);
    
    	FlushBatchDraw();
    	EndBatchDraw();
    
    	MOUSEMSG m4;
    	while (1)
    	{
    		m4 = GetMouseMsg();
    		if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
    		{
    			setlinecolor(RED);
    			rectangle(380, 700, 800, 750);
    			if (m4.uMsg == WM_LBUTTONDOWN)
    			{
    				//返回
    				cleardevice();
    				UserPage();
    			}
    		}
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(380, 700, 800, 750);
    		}
    	}
    }

    因为我设置了不同的背景,所以我做了两个不同的函数来展示所有数据

    void FindBook()
    {
    	int Position = ReturnPosition();
    	initgraph(1170, 869);
    	IMAGE img_bk;
    	loadimage(&img_bk, "./bk3.jpg");
    	cleardevice();//清屏
    	BeginBatchDraw();//开始批量绘图
    	putimage(0, 0, &img_bk);//展示背景图片
    	setbkmode(TRANSPARENT);//设置背景模式透明
    
    	//标题
    	char SecondTitle[20] = "查找图书界面";
    	settextstyle(40, 0, "华文行楷");
    	outtextxy(0, 0, SecondTitle);
    
    	settextstyle(30, 0, "隶书");
    	settextcolor(BLACK);
    	outtextxy(150, 30, "图书名称");
    	outtextxy(450, 30, "作者");
    	outtextxy(680, 30, "图书总数");
    	outtextxy(900, 30, "借阅数");
    
    	if (Position == -1)//没找到
    	{
    		//获取窗口句柄
    		HWND hndtipsM = GetHWnd();
    		//用一个字符数组来总结句子
    		int isok = MessageBox(hndtipsM, "抱歉,没有这本书!", "提示", MB_OK);
    	}
    	else
    	{
    		//打印找到的信息
    		outtextxy(150, 80, books[Position].title);//输出书名
    		outtextxy(450, 80, books[Position].author);
    		outtextxy(680, 80, books[Position].totalnum);
    		outtextxy(900, 80, books[Position].borrownum);
    	}
    
    	setfillcolor(RGB(56, 242, 212));
    	fillrectangle(380, 700, 800, 750);
    	settextcolor(BLACK);
    	settextstyle(40, 0, "隶书");
    	char SecondSelect5[20] = { "返回" };
    	outtextxy(395, 705, SecondSelect5);
    
    	FlushBatchDraw();
    	EndBatchDraw();
    
    
    	//定义第三个鼠标操作
    	MOUSEMSG m4;
    	while (1)
    	{
    		m4 = GetMouseMsg();
    		if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
    		{
    			setlinecolor(RED);
    			rectangle(380, 700, 800, 750);
    			if (m4.uMsg == WM_LBUTTONDOWN)
    			{
    				//返回
    				UserPage();
    			}
    		}
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(380, 700, 800, 750);
    		}
    	}
    }
    

    查找图书信息

    void addstring(char s1[], char s2[])
    {
    	int i = atoi(s1);
    	int j = atoi(s2);
    	int sum = i + j;
    	sprintf(s1, "%d", sum);
    }
    
    void BorrowBook()
    {
    	//定义一个变量用来接收下标
    	int TempBorr = ReturnPosition();
    
    	if (TempBorr == -1)//没找到
    	{
    		//获取窗口句柄
    		HWND hndtipsF = GetHWnd();
    		//用一个字符数组来总结句子
    		int isok = MessageBox(hndtipsF, "无法借阅!", "提示", MB_OK);
    	}
    	else//找到了——将借阅出去的图书信息存储到另一个文件中,归还时重新读入
    	{
    		initgraph(1170, 869);
    		cleardevice();//清屏
    		IMAGE img_bk;
    		loadimage(&img_bk, "./bk3.jpg");
    		BeginBatchDraw();//开始批量绘图
    		putimage(0, 0, &img_bk);//展示背景图片
    		setbkmode(TRANSPARENT);//设置背景模式透明
    
    		//标题
    		char SecondTitle[20] = "图书借阅界面";
    		settextstyle(40, 0, "华文行楷");
    		outtextxy(0, 0, SecondTitle);
    
    		if (strlen(books[TempBorr].title) != 0 && strlen(books[TempBorr].author) != 0)
    		{
    			addstring(books[TempBorr].borrownum, s);
    			fstream myFile;
    			myFile.open("borrow.txt", ios::app);  // append,追加
    			//myFile.open("data.txt", ios::trunc);  //- 删除现有文件中的数据
    			myFile << books[TempBorr].title << " "
    				<< books[TempBorr].author << endl;
    			myFile.close();//关闭文件
    		}
    		SaveAlter();
    		HWND hndtipsF = GetHWnd();
    		int isok = MessageBox(hndtipsF, "借阅成功", "提示", MB_OK);
    		RecordNum++;
    
    
    		settextstyle(30, 0, "隶书");
    		settextcolor(BLACK);
    		outtextxy(150, 30, "图书名称");
    		outtextxy(450, 30, "作者");
    
    		ReadIn2();
    		//打印找到的信息
    		for (int i = 1; i <= RecordNum; i++)
    		{
    			//缩放字体
    			settextstyle(25, 0, "隶书");
    			outtextxy(150, 40 + 40 * i, bobooks[i - 1].title);//输出书名
    			outtextxy(450, 40 + 40 * i, bobooks[i - 1].author);//作者
    		}
    
    		setfillcolor(RGB(191, 149, 214));
    		fillrectangle(380, 620, 800, 670);
    		fillrectangle(380, 700, 800, 750);
    		settextcolor(BLACK);
    		settextstyle(40, 0, "隶书");
    		char SecondSelect4[20] = { "继续借阅" };
    		char SecondSelect5[20] = { "返回" };
    		outtextxy(395, 625, SecondSelect4);
    		outtextxy(395, 705, SecondSelect5);
    
    		FlushBatchDraw();
    		EndBatchDraw();
    
    
    		//定义第三个鼠标操作
    		MOUSEMSG m4;
    		while (1)
    		{
    			m4 = GetMouseMsg();
    			if (m4.x >= 380 && m4.x <= 800 && m4.y >= 620 && m4.y <= 670)
    			{
    				setlinecolor(RED);
    				rectangle(380, 620, 800, 670);
    				if (m4.uMsg == WM_LBUTTONDOWN)
    				{
    					//继续借阅
    					BorrowBook();
    				}
    			}
    			if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
    			{
    				setlinecolor(RED);
    				rectangle(380, 700, 800, 750);
    				if (m4.uMsg == WM_LBUTTONDOWN)
    				{
    					//返回
    					cleardevice();
    					UserPage();
    				}
    			}
    			else
    			{
    				setlinecolor(WHITE);
    				rectangle(380, 620, 800, 670);
    				rectangle(380, 700, 800, 750);
    			}
    		}
    
    	}
    }

    因为我存储的图书数量是利用字符数组存储,所有借阅量需要单独写一个函数实现字符串之间的加法,好像有点bug,会吸收文本里的空格,所有每次运行之后存储图书信息里的文字会变乱。归还功能

    int RePosition()
    {
    	//接受用户输入
    	char ReceInput[64];
    	InputBox(ReceInput, 100, "请输入书名或者作者名进行操作");//显示一个输入框
    	for (int w = 0; w < BookNum; w++)//进行循环查找,一旦相同就跳出循环
    	{
    		if (strcmp(books[w].title, ReceInput) == 0 || strcmp(books[w].author, ReceInput) == 0)//返回0表示两个字符串相等
    		{
    			return w;
    		}
    		//strcmp用法:
    		/*该函数返回值如下:
    如果返回值小于 0,则表示 str1 小于 str2。
    如果返回值大于 0,则表示 str1 大于 str2。
    如果返回值等于 0,则表示 str1 等于 str2。*/
    	}
    	//如果没找到就返回-1
    	return -1;
    }
    
    void ReturnBook()
    {
    	int TempBorr = RePosition();
    	if (TempBorr == -1)//没找到
    	{
    		//获取窗口句柄
    		HWND hndtipsF = GetHWnd();//获得窗口句柄
    		//在 Windows 下,句柄是一个窗口的标识
    		//得到句柄后,可以使用 Windows API 中的函数实现对窗口的控制。
    		//用一个字符数组来总结句子
    		int isok = MessageBox(hndtipsF, "归还失败!", "提示", MB_OK);
    	}
    	else//找到了——将借阅出去的图书信息存储到另一个文件中,归还时重新读入
    	{
    		fstream myFile;
    		myFile.open("Return.txt", ios::out);//写入
    		for (int i = 0; i < RecordNum; i++)
    		{
    			if (strlen(bobooks[i].title) != 0 && strlen(bobooks[i].author) != 0)
    			{
    				myFile << bobooks[i].title << " "
    					<< bobooks[i].author << endl;
    			}
    		}
    		myFile.close();
    		HWND hndtipsF = GetHWnd();
    		int isok = MessageBox(hndtipsF, "归还成功", "提示", MB_OK);
    	}
    }

    查看用户信息,没有很大的用处

    void UserInforPage()
    {
    	initgraph(1170, 869);
    	IMAGE img_bk;
    	loadimage(&img_bk, "./bk3.jpg");
    	cleardevice();//清屏
    	BeginBatchDraw();//开始批量绘图
    	putimage(0, 0, &img_bk);//展示背景图片
    	setbkmode(TRANSPARENT);//设置背景模式透明
    
    	//标题
    	char SecondTitle[20] = "用户信息界面";
    	settextstyle(40, 0, "华文行楷");
    	outtextxy(0, 0, SecondTitle);
    
    	settextcolor(BLACK);
    	settextstyle(50, 0, "隶书");
    	outtextxy(30, 30, "借阅过的图书");
    	outtextxy(30, 350, "归还的图书");
    
    	//借阅
    	settextstyle(30, 0, "隶书");
    	outtextxy(60, 70, "图书名称");
    	outtextxy(400, 70, "作者");
    
    	//归还
    	outtextxy(60, 390, "图书名称");
    	outtextxy(400, 390, "作者");
    
    	ReadIn2();
    	if (RecordNum == 0)
    	{
    		settextstyle(50, 0, "隶书");
    		outtextxy(200, 200, "当前记录为空!");
    		return;
    	}
    	for (int i = 1; i <= RecordNum; i++)
    	{
    		//缩放字体
    		settextstyle(25, 0, "隶书");
    		outtextxy(60, 100 + 30 * i, bobooks[i - 1].title);//输出书名
    		outtextxy(400, 100 + 30 * i, bobooks[i - 1].author);//作者
    	}
    
    	ReadIn3();
    	if (ReturnNum == 0)
    	{
    		settextstyle(50, 0, "隶书");
    		outtextxy(200, 200, "当前记录为空!");
    		return;
    	}
    	for (int i = 1; i <= ReturnNum; i++)
    	{
    		//缩放字体
    		settextstyle(25, 0, "隶书");
    		outtextxy(60, 420 + 30 * i, rebooks[i - 1].title);//输出书名
    		outtextxy(400, 420 + 30 * i, rebooks[i - 1].author);//作者
    	}
    
    	setfillcolor(RGB(191, 149, 214));
    	fillrectangle(380, 700, 800, 750);
    	settextcolor(BLACK);
    	settextstyle(40, 0, "隶书");
    	char SecondSelect5[20] = { "返回" };
    	outtextxy(395, 705, SecondSelect5);
    
    	FlushBatchDraw();
    	EndBatchDraw();
    
    	//定义第三个鼠标操作
    	MOUSEMSG m4;
    	while (1)
    	{
    		m4 = GetMouseMsg();
    		if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
    		{
    			setlinecolor(RED);
    			rectangle(380, 700, 800, 750);
    			if (m4.uMsg == WM_LBUTTONDOWN)
    			{
    				//返回
    				UserPage();
    			}
    		}
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(380, 700, 800, 750);
    		}
    	}
    }

    项目的总代码

#include<stdio.h>
#include<string>
#include<easyx.h>
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<stdbool.h>
#include <fstream>
using namespace std;

#define MAXSIZE 100

//定义一个存储图书信息的结构体
//定义数组存储所有图书信息
typedef struct
{
	char title[1000];//书名
	char author[1000];//作者
	char totalnum[1000];//图书总数
	char borrownum[1000];//图书借阅数
}Book;
Book books[MAXSIZE];

//定义一个存储借阅图书信息的结构体
//定义数组存储所有图书信息
typedef struct
{
	char title[1000];//书名
	char author[1000];//作者
}BoBook;
BoBook bobooks[MAXSIZE];

//定义一个存储归还图书信息的结构体
//定义数组存储所有图书信息
typedef struct
{
	char title[1000];//书名
	char author[1000];//作者
}ReBook;
ReBook rebooks[MAXSIZE];

//定义管理员结构体
//为了方便只设置一个管理员
typedef struct
{
	char name[1000];
	char code[1000];
}Manager;
Manager managers;

//定义用户结构体
//为了方便只设置一个用户
typedef struct
{
	char name[1000];
	char code[1000];
}User;
User users;

//当前书籍数目
int BookNum;
int RecordNum;
int ReturnNum;
char s[1000] = "1";

void ReadIn();//先把文件中的信息录入数组
void ReadIn2();//把借阅的信息存入数组
void ReadIn3();//归还信息

void FirstPage();//首页画面
void ManagerPage();//管理员界面
void ReSiPage();//用户注册或者登录界面
void UserPage();//用户界面
void ManagerSignIn();//管理员登录界面
void UserSignIn();//用户登录界面
void ViewAllBook1();//管理员查看全部图书信息
void ViewAllBook2();//用户查看全部图书信息
void PrintfBook();//打印全部图书信息

void AlterBook();//修改图书信息
bool BookFormat(char PerStr[]);//判断图书格式是否正确
void SaveAlter();//保存修改后的信息
void DeleteBook();//删除图书信息
void AddBook();//新增图书信息
void SaveInfor();//保存新增的信息
int ReturnPosition();//返回需要查找、修改、删除的图书下标

void FindBook();//查找图书
void addstring(char s1, char s2);//用于字符之间的计算
void BorrowBook();//借阅图书
void ReturnBook();//归还图书
void UserInforPage();//用户信息
int RePosition();


void ReadIn()
{
	fstream myFile;
	myFile.open("data.txt", ios::in);  // 只读
	//将文件中的数据读取到当前的结构体数组中
	for (int i = 0; i < MAXSIZE; i++)
	{
		myFile >> books[i].title
			>> books[i].author
			>> books[i].totalnum
			>> books[i].borrownum;
	}
	int FileBookNums = 0;//文件中的记录数
	for (int i = 0; i < MAXSIZE; i++)//最多读15本书,读入前先判断标题是否为空
	{
		if (strlen(books[i].title) != 0)
		{
			BookNum = ++FileBookNums;//双自增
		}
	}
	myFile.close();
}

void ReadIn2()
{
	fstream myFile;
	myFile.open("Borrow.txt", ios::in);  // 只读
	//将文件中的数据读取到当前的结构体数组中
	for (int i = 0; i < MAXSIZE; i++)
	{
		myFile >> bobooks[i].title
			>> bobooks[i].author;
	}
	int FileBookNums = 0;//文件中的记录数
	for (int i = 0; i < MAXSIZE; i++)//最多读15本书,读入前先判断标题是否为空
	{
		if (strlen(bobooks[i].title) != 0)
		{
			RecordNum = ++FileBookNums;//双自增
		}
	}
	myFile.close();
}

void ReadIn3()
{
	fstream myFile;
	myFile.open("Return.txt", ios::in);  // 只读
	//将文件中的数据读取到当前的结构体数组中
	for (int i = 0; i < MAXSIZE; i++)
	{
		myFile >> rebooks[i].title
			>> rebooks[i].author;
	}
	int FileBookNums = 0;//文件中的记录数
	for (int i = 0; i < MAXSIZE; i++)//最多读15本书,读入前先判断标题是否为空
	{
		if (strlen(rebooks[i].title) != 0)
		{
			ReturnNum = ++FileBookNums;//双自增
		}
	}
	myFile.close();
}

void FirstPage()
{
	initgraph(1170, 869);
	IMAGE img_bk;
	loadimage(&img_bk, "./bk1.jpg");
	cleardevice();//清屏
	BeginBatchDraw();//开始批量绘图
	putimage(0, 0, &img_bk);//展示背景图片
	setbkmode(TRANSPARENT);//设置背景模式透明

	//大标题
	char FirstTitle[20] = { "图书管理系统" };
	settextstyle(80, 0, "华文行楷");
	outtextxy(350, 50, FirstTitle);
	//首页的三个选项
	setfillcolor(RGB(255, 197, 110));
	fillrectangle(380, 300, 800, 350);
	fillrectangle(380, 380, 800, 430);
	fillrectangle(380, 460, 800, 510);

	//三个选项的文字
	settextcolor(BLACK);
	settextstyle(40, 0, "隶书");
	//首页三个选项
	char FirstSelect1[20] = { "管理员操作界面" };
	char FirstSelect2[20] = { "用户操作界面" };
	char FirstSelect3[20] = { "退出系统" };
	outtextxy(395, 305, FirstSelect1);
	outtextxy(395, 385, FirstSelect2);
	outtextxy(395, 465, FirstSelect3);

	FlushBatchDraw();
	EndBatchDraw();

	//鼠标操作
	MOUSEMSG m1;
	//进入主界面选项操作
	while (1)
	{
		m1 = GetMouseMsg();//获取鼠标操作
		if (m1.x >= 380 && m1.x <= 800 && m1.y >= 300 && m1.y <= 350)//管理员界面
		{
			setlinecolor(RED);
			rectangle(380, 300, 800, 350);
			if (m1.uMsg == WM_LBUTTONDOWN)
			{
				ManagerSignIn();
			}
		}
		else if (m1.x >= 380 && m1.x <= 800 && m1.y >= 380 && m1.y <= 430)//用户界面
		{
			setlinecolor(RED);
			rectangle(380, 380, 800, 430);
			if (m1.uMsg == WM_LBUTTONDOWN)
			{
				ReSiPage();
			}
		}
		else if (m1.x >= 380 && m1.x <= 800 && m1.y >= 460 && m1.y <= 510)
		{
			setlinecolor(RED);
			rectangle(380, 460, 800, 510);
			if (m1.uMsg == WM_LBUTTONDOWN)
			{
				exit(0);
			}
		}
		//鼠标不在上面悬停
		else
		{
			setlinecolor(WHITE);
			rectangle(380, 300, 800, 350);
			rectangle(380, 380, 800, 430);
			rectangle(380, 460, 800, 510);
		}
	}
}

void ManagerSignIn()
{
	ifstream  AdminSignIn;
	AdminSignIn.open("ManagerSignIn.txt", ios::in);
	AdminSignIn >> managers.name >> managers.code;
	AdminSignIn.close();// 关闭文件
	char ReceAcctNumber[1000];
	InputBox(ReceAcctNumber, 1000, "请输入管理员名");
	char ReceAcctPassWord[1000];
	InputBox(ReceAcctPassWord, 1000, "请输入密码");
	//如果用户名和密码都正确才进度到管理员界面
	//否则弹窗提示错误
	if (strcmp(managers.name, ReceAcctNumber) == 0 && strcmp(managers.code, ReceAcctPassWord) == 0)
	{
		cleardevice();//清屏
		ManagerPage();
	}
	else
	{
		HWND SignError = GetHWnd();//这个函数用于获取绘图窗口句柄。
		int isok = MessageBox(SignError, "用户名或密码错误!", "提示", MB_OK);
	}
}

void UserRegister()
{
	while (1)
	{
		InputBox(users.name, 20, "请输入注册用户名称:");//显示一个输入框,
		if (BookFormat(users.name))//为真跳出循环
		{
			break;
		}
	}
	while (1)
	{
		InputBox(users.code, 20, "请输入注册用户的密码:");//显示一个输入框,
		if (BookFormat(users.code))//为真跳出循环
		{
			break;
		}
	}

	if (strlen(users.name) != 0 && strlen(users.code) != 0)
	{
		fstream myFile;
		myFile.open("UserSignIn.txt", ios::app);  // append,追加
		myFile << users.name << " "
			<< users.code << endl;
		myFile.close();
	}

	ReSiPage();
}

void UserSignIn()
{
	ifstream UserSignIn;
	UserSignIn.open("UserSignIn.txt", ios::in);
	UserSignIn >> users.name >> users.code;
	UserSignIn.close();// 关闭文件
	char ReceAcctNumber[1000];
	InputBox(ReceAcctNumber, 1000, "请输入用户名");
	char ReceAcctPassWord[1000];
	InputBox(ReceAcctPassWord, 1000, "请输入密码");
	//如果用户名和密码都正确才进度到管理员界面
	//否则弹窗提示错误
	if (strcmp(users.name, ReceAcctNumber) == 0 && strcmp(users.code, ReceAcctPassWord) == 0)
	{
		cleardevice();//清屏
		UserPage();
	}
	else
	{
		HWND SignError = GetHWnd();//这个函数用于获取绘图窗口句柄。
		int isok = MessageBox(SignError, "用户名或密码错误!", "提示", MB_OK);
	}
}

void ReSiPage()
{
	initgraph(1170, 869);
	IMAGE img_bk;
	loadimage(&img_bk, "./bk3.jpg");
	cleardevice();//清屏
	BeginBatchDraw();//开始批量绘图
	putimage(0, 0, &img_bk);//展示背景图片
	setbkmode(TRANSPARENT);//设置背景模式透明

	//标题
	char SecondTitle[20] = "用户注册或登录界面";
	settextstyle(40, 0, "华文行楷");
	outtextxy(0, 0, SecondTitle);

	//三个选项的背景
	setfillcolor(RGB(191, 149, 214));
	fillrectangle(380, 300, 800, 350);
	fillrectangle(380, 380, 800, 430);
	fillrectangle(380, 460, 800, 510);

	//三个选项的文字
	settextcolor(BLACK);
	settextstyle(40, 0, "隶书");
	//首页三个选项
	char SecondSelect1[20] = { "注册" };
	char SecondSelect2[20] = { "登录" };
	char SecondSelect6[20] = { "返回" };
	outtextxy(395, 305, SecondSelect1);
	outtextxy(395, 385, SecondSelect2);
	outtextxy(395, 465, SecondSelect6);

	FlushBatchDraw();
	EndBatchDraw();

	//定义第三个鼠标操作
	MOUSEMSG m3;
	//进入主界面选项操作界面
	while (1)
	{
		m3 = GetMouseMsg();//获取鼠标操作
		if (m3.x >= 380 && m3.x <= 800 && m3.y >= 300 && m3.y <= 350)//注册
		{
			setlinecolor(RED);
			rectangle(380, 300, 800, 350);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				UserRegister();
			}
		}
		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 380 && m3.y <= 430)//登录
		{
			setlinecolor(RED);
			rectangle(380, 380, 800, 430);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				UserSignIn();
			}
		}
		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 460 && m3.y <= 510)//借
		{
			setlinecolor(RED);
			rectangle(380, 460, 800, 510);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				//返回
				cleardevice();
				FirstPage();
			}
		}
		//鼠标不在上面悬停
		else
		{
			setlinecolor(WHITE);
			rectangle(380, 300, 800, 350);
			rectangle(380, 380, 800, 430);
			rectangle(380, 460, 800, 510);
		}
	}
}

void ManagerPage()
{
	initgraph(1170, 869);
	IMAGE img_bk;
	loadimage(&img_bk, "./bk2.jpg");
	cleardevice();//清屏
	BeginBatchDraw();//开始批量绘图
	putimage(0, 0, &img_bk);//展示背景图片
	setbkmode(TRANSPARENT);//设置背景模式透明

	//标题
	char SecondTitle[20] = "管理员操作界面";
	settextstyle(40, 0, "华文行楷");
	outtextxy(0, 0, SecondTitle);

	//三个选项的背景
	setfillcolor(RGB(56, 242, 212));
	fillrectangle(380, 300, 800, 350);
	fillrectangle(380, 380, 800, 430);
	fillrectangle(380, 460, 800, 510);
	fillrectangle(380, 540, 800, 590);
	fillrectangle(380, 620, 800, 670);

	//三个选项的文字
	settextcolor(BLACK);
	settextstyle(40, 0, "隶书");
	//首页三个选项
	char SecondSelect1[20] = { "查看所有图书" };
	char SecondSelect2[20] = { "修改图书信息" };
	char SecondSelect3[20] = { "删除图书信息" };
	char SecondSelect4[20] = { "增加图书信息" };
	char SecondSelect5[20] = { "返回" };
	outtextxy(395, 305, SecondSelect1);
	outtextxy(395, 385, SecondSelect2);
	outtextxy(395, 465, SecondSelect3);
	outtextxy(395, 545, SecondSelect4);
	outtextxy(395, 625, SecondSelect5);

	FlushBatchDraw();
	EndBatchDraw();

	//定义第二个鼠标操作
	MOUSEMSG m2;
	//进入主界面选项操作界面
	while (1)
	{
		m2 = GetMouseMsg();//获取鼠标操作
		if (m2.x >= 380 && m2.x <= 800 && m2.y >= 300 && m2.y <= 350)//查
		{
			setlinecolor(RED);
			rectangle(380, 300, 800, 350);
			if (m2.uMsg == WM_LBUTTONDOWN)
			{
				cleardevice();
				ViewAllBook1();
			}
		}
		else if (m2.x >= 380 && m2.x <= 800 && m2.y >= 380 && m2.y <= 430)//改
		{
			setlinecolor(RED);
			rectangle(380, 380, 800, 430);
			if (m2.uMsg == WM_LBUTTONDOWN)
			{
				AlterBook();
			}
		}
		else if (m2.x >= 380 && m2.x <= 800 && m2.y >= 460 && m2.y <= 510)//删
		{
			setlinecolor(RED);
			rectangle(380, 460, 800, 510);
			if (m2.uMsg == WM_LBUTTONDOWN)
			{
				DeleteBook();
			}
		}
		else if (m2.x >= 380 && m2.x <= 800 && m2.y >= 540 && m2.y <= 590)//增
		{
			setlinecolor(RED);
			rectangle(380, 540, 800, 590);
			if (m2.uMsg == WM_LBUTTONDOWN)
			{
				AddBook();
			}
		}
		else if (m2.x >= 380 && m2.x <= 800 && m2.y >= 620 && m2.y <= 670)
		{
			setlinecolor(RED);
			rectangle(380, 620, 800, 670);
			if (m2.uMsg == WM_LBUTTONDOWN)
			{
				//返回
				cleardevice();
				FirstPage();
			}
		}
		//鼠标不在上面悬停
		else
		{
			setlinecolor(WHITE);
			rectangle(380, 300, 800, 350);
			rectangle(380, 380, 800, 430);
			rectangle(380, 460, 800, 510);
			rectangle(380, 540, 800, 590);
			rectangle(380, 620, 800, 670);
		}
	}
}

void UserPage()
{
	initgraph(1170, 869);
	IMAGE img_bk;
	loadimage(&img_bk, "./bk3.jpg");
	cleardevice();//清屏
	BeginBatchDraw();//开始批量绘图
	putimage(0, 0, &img_bk);//展示背景图片
	setbkmode(TRANSPARENT);//设置背景模式透明

	//标题
	char SecondTitle[20] = "用户操作界面";
	settextstyle(40, 0, "华文行楷");
	outtextxy(0, 0, SecondTitle);

	//三个选项的背景
	setfillcolor(RGB(191, 149, 214));
	fillrectangle(380, 300, 800, 350);
	fillrectangle(380, 380, 800, 430);
	fillrectangle(380, 460, 800, 510);
	fillrectangle(380, 540, 800, 590);
	fillrectangle(380, 620, 800, 670);
	fillrectangle(380, 700, 800, 750);

	//三个选项的文字
	settextcolor(BLACK);
	settextstyle(40, 0, "隶书");
	//首页三个选项
	char SecondSelect1[20] = { "查看所有图书" };
	char SecondSelect2[20] = { "查找图书信息" };
	char SecondSelect3[20] = { "借阅图书" };
	char SecondSelect4[20] = { "归还图书" };
	char SecondSelect5[20] = { "查看用户信息" };
	char SecondSelect6[20] = { "返回" };
	outtextxy(395, 305, SecondSelect1);
	outtextxy(395, 385, SecondSelect2);
	outtextxy(395, 465, SecondSelect3);
	outtextxy(395, 545, SecondSelect4);
	outtextxy(395, 625, SecondSelect5);
	outtextxy(395, 705, SecondSelect6);

	FlushBatchDraw();
	EndBatchDraw();

	//定义第三个鼠标操作
	MOUSEMSG m3;
	//进入主界面选项操作界面
	while (1)
	{
		m3 = GetMouseMsg();//获取鼠标操作
		if (m3.x >= 380 && m3.x <= 800 && m3.y >= 300 && m3.y <= 350)//查
		{
			setlinecolor(RED);
			rectangle(380, 300, 800, 350);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				cleardevice();
				ViewAllBook2();
			}
		}
		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 380 && m3.y <= 430)//找
		{
			setlinecolor(RED);
			rectangle(380, 380, 800, 430);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				FindBook();
			}
		}
		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 460 && m3.y <= 510)//借
		{
			setlinecolor(RED);
			rectangle(380, 460, 800, 510);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				BorrowBook();
			}
		}
		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 540 && m3.y <= 590)//还
		{
			setlinecolor(RED);
			rectangle(380, 540, 800, 590);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				ReturnBook();
			}
		}
		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 620 && m3.y <= 670)
		{
			setlinecolor(RED);
			rectangle(380, 620, 800, 670);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				cleardevice();
				UserInforPage();
			}
		}
		else if (m3.x >= 380 && m3.x <= 800 && m3.y >= 700 && m3.y <= 750)
		{
			setlinecolor(RED);
			rectangle(380, 700, 800, 750);
			if (m3.uMsg == WM_LBUTTONDOWN)
			{
				//返回
				cleardevice();
				FirstPage();
			}
		}
		//鼠标不在上面悬停
		else
		{
			setlinecolor(WHITE);
			rectangle(380, 300, 800, 350);
			rectangle(380, 380, 800, 430);
			rectangle(380, 460, 800, 510);
			rectangle(380, 540, 800, 590);
			rectangle(380, 620, 800, 670);
			rectangle(380, 700, 800, 750);
		}
	}
}

void PrintfBook()
{
	if (BookNum == 0)
	{
		settextstyle(50, 0, "隶书");
		outtextxy(200, 200, "当前记录为空!");
		return;
	}
	for (int i = 1; i <= BookNum; i++)
	{
		//缩放字体
		settextstyle(25, 0, "隶书");
		outtextxy(150, 40 + 40 * i, books[i - 1].title);//输出书名
		outtextxy(450, 40 + 40 * i, books[i - 1].author);//作者
		outtextxy(680, 40 + 40 * i, books[i - 1].totalnum);//图书总数
		outtextxy(900, 40 + 40 * i, books[i - 1].borrownum);//借阅数
	}
}

void ViewAllBook1()
{
	initgraph(1170, 869);
	IMAGE img_bk;
	loadimage(&img_bk, "./bk2.jpg");
	cleardevice();//清屏
	BeginBatchDraw();//开始批量绘图
	putimage(0, 0, &img_bk);//展示背景图片
	setbkmode(TRANSPARENT);//设置背景模式透明

	//标题
	char SecondTitle[20] = "查看所有图书";
	settextstyle(35, 0, "华文行楷");
	outtextxy(0, 0, SecondTitle);

	settextstyle(30, 0, "隶书");
	settextcolor(BLACK);
	outtextxy(150, 30, "图书名称");
	outtextxy(450, 30, "作者");
	outtextxy(680, 30, "图书总数");
	outtextxy(900, 30, "图书借阅数");
	PrintfBook();

	setfillcolor(RGB(56, 242, 212));
	fillrectangle(380, 700, 800, 750);
	settextcolor(BLACK);
	settextstyle(40, 0, "隶书");
	char SecondSelect5[20] = { "返回" };
	outtextxy(395, 705, SecondSelect5);

	FlushBatchDraw();
	EndBatchDraw();

	MOUSEMSG m4;
	while (1)
	{
		m4 = GetMouseMsg();
		if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
		{
			setlinecolor(RED);
			rectangle(380, 700, 800, 750);
			if (m4.uMsg == WM_LBUTTONDOWN)
			{
				//返回
				ManagerPage();
			}
		}
		else
		{
			setlinecolor(WHITE);
			rectangle(380, 700, 800, 750);
		}
	}
}

void ViewAllBook2()
{
	initgraph(1170, 869);
	IMAGE img_bk;

	loadimage(&img_bk, "./bk3.jpg");
	cleardevice();//清屏
	BeginBatchDraw();//开始批量绘图
	putimage(0, 0, &img_bk);//展示背景图片
	setbkmode(TRANSPARENT);//设置背景模式透明

	//标题
	char SecondTitle[20] = "查看所有图书";
	settextstyle(35, 0, "华文行楷");
	outtextxy(0, 0, SecondTitle);

	settextstyle(30, 0, "隶书");
	settextcolor(BLACK);
	outtextxy(150, 30, "图书名称");
	outtextxy(450, 30, "作者");
	outtextxy(680, 30, "图书总数");
	outtextxy(900, 30, "图书借阅数");
	PrintfBook();


	setfillcolor(RGB(191, 149, 214));
	fillrectangle(380, 700, 800, 750);
	settextcolor(BLACK);
	settextstyle(40, 0, "隶书");
	char SecondSelect5[20] = { "返回" };
	outtextxy(395, 705, SecondSelect5);

	FlushBatchDraw();
	EndBatchDraw();

	MOUSEMSG m4;
	while (1)
	{
		m4 = GetMouseMsg();
		if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
		{
			setlinecolor(RED);
			rectangle(380, 700, 800, 750);
			if (m4.uMsg == WM_LBUTTONDOWN)
			{
				//返回
				cleardevice();
				UserPage();
			}
		}
		else
		{
			setlinecolor(WHITE);
			rectangle(380, 700, 800, 750);
		}
	}
}

//返回要查找、修改、删除人所在的结构体的下标
int ReturnPosition()
{
	//接受用户输入
	char ReceInput[200];
	InputBox(ReceInput, 100, "请输入书名或者作者名进行操作");//显示一个输入框
	//进行循环查找,一旦相同就跳出循环
	for (int i = 0; i < BookNum; i++)
	{
		if (strcmp(books[i].title, ReceInput) == 0 || strcmp(books[i].author, ReceInput) == 0)//返回0表示两个字符串相等
		{
			return i;
		}
	}
	//如果没找到就返回-1
	return -1;
}

//判断输入的图书名字格式是否正确
bool BookFormat(char PerStr[])
{
	return true;
}

void SaveAlter()
{
	//先删掉,但是不将人数置空所以不能调用之前的删除函数
	fstream myFile;
	myFile.open("data.txt", ios::trunc);  //- 删除现有文件中的数据
	myFile.open("data.txt", ios::out);//写入
	for (int i = 0; i < BookNum; i++)
	{
		if (strlen(books[i].title) != 0 && strlen(books[i].author) != 0)
		{

			myFile << books[i].title << " "
				<< books[i].author << " "
				<< books[i].totalnum << ""
				<< books[i].borrownum << endl;
		}
	}
	myFile.close();
}

void AlterBook()//改
{
	//直接套用上面查找的操作,在此基础上加一行修改前
	//因为需要得到要修改人在结构体数组中的位置-下标,所以不能将函数直接拿过来用,得粘贴过来
	//定义一个变量用来接收下标
	int TempModi = ReturnPosition();
	if (TempModi == -1)//没找到
	{
		//获取窗口句柄
		HWND hndtipsM = GetHWnd();
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsM, "抱歉,没有这本书!", "提示", MB_OK);
	}
	else//找到了这本书进行下面的操作
	{
		cleardevice();
		initgraph(1170, 869);
		cleardevice();
		BeginBatchDraw();

		IMAGE img_bk;
		loadimage(&img_bk, "./bk2.jpg");
		putimage(0, 0, &img_bk);
		setbkmode(TRANSPARENT);

		//标题
		char SecondTitle[20] = "修改图书信息";
		settextstyle(35, 0, "华文行楷");
		outtextxy(0, 0, SecondTitle);

		settextcolor(BLACK);
		settextstyle(50, 0, "隶书");
		outtextxy(30, 30, "修改前");
		outtextxy(30, 350, "修改后");

		settextstyle(30, 0, "隶书");
		outtextxy(60, 70, "图书名称");
		outtextxy(400, 70, "作者");
		outtextxy(650, 70, "图书总数");
		outtextxy(800, 70, "借阅数");

		//修改后
		outtextxy(60, 390, "图书名称");
		outtextxy(400, 390, "作者");
		outtextxy(650, 390, "图书总数");
		outtextxy(800, 390, "借阅数");

		//打印找到的信息
		outtextxy(60, 100, books[TempModi].title);//输出书名
		outtextxy(400, 100, books[TempModi].author);//输出作者
		outtextxy(650, 100, books[TempModi].totalnum);//输出图书总数
		outtextxy(800, 100, books[TempModi].borrownum);//输出借阅数

		setfillcolor(RGB(56, 242, 212));
		fillrectangle(380, 700, 800, 750);
		settextcolor(BLACK);
		settextstyle(40, 0, "隶书");
		char SecondSelect5[20] = { "返回" };
		outtextxy(395, 705, SecondSelect5);

		FlushBatchDraw();
		EndBatchDraw();

		while (1)
		{
			//接收输入的修改后的值覆盖进去
			InputBox(books[TempModi].title, 20, "请输入修改后的书名");
			if (BookFormat(books[TempModi].title))
			{
				break;
			}
		}
		while (1)
		{
			//接收输入的修改后的值覆盖进去
			InputBox(books[TempModi].author, 20, "请输入修改后的作者名");
			if (BookFormat(books[TempModi].author))
			{
				break;
			}
		}
		while (1)
		{
			//接收输入的修改后的值覆盖进去
			InputBox(books[TempModi].totalnum, 20, "请输入修改后的出版社");
			if (BookFormat(books[TempModi].totalnum))
			{
				break;
			}
		}
		while (1)
		{
			//接收输入的修改后的值覆盖进去
			InputBox(books[TempModi].borrownum, 20, "请输入修改后的作者名");
			if (BookFormat(books[TempModi].borrownum))
			{
				break;
			}
		}

		settextstyle(30, 0, "隶书");
		outtextxy(60, 420, books[TempModi].title);//输出书名
		outtextxy(400, 420, books[TempModi].author);
		outtextxy(650, 420, books[TempModi].totalnum);
		outtextxy(800, 420, books[TempModi].borrownum);
		SaveAlter();

		//定义第三个鼠标操作
		MOUSEMSG m4;
		while (1)
		{
			m4 = GetMouseMsg();
			if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
			{
				setlinecolor(RED);
				rectangle(380, 700, 800, 750);
				if (m4.uMsg == WM_LBUTTONDOWN)
				{
					//返回
					ManagerPage();
				}
			}
			else
			{
				setlinecolor(WHITE);
				rectangle(380, 700, 800, 750);
			}
		}

	}
}

void DeleteBook()//删
{
	//先查找,找到返回下标,删除后下标后的数据前移,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 < BookNum; d++)
			{
				books[d] = books[d + 1];
			}
			//现在的人数-1
			BookNum--;
			//删除完成只是将当前结构体里面的数据清除了,但是文件中并没有作出更改
			//更新到文件中
			SaveAlter();//用这个全部清空的函数,再对文件进行重写
		}
		else if (isok == IDCANCEL)
		{
			//取消删除不执行任何操作
		}
	}
}

void SaveInfor()
{
	if (strlen(books[BookNum].title) != 0 && strlen(books[BookNum].author) != 0)
	{
		fstream myFile;
		myFile.open("data.txt", ios::app);  // append,追加
		myFile << books[BookNum].title << " "
			<< books[BookNum].author << " "
			<< books[BookNum].totalnum << " "
			<< books[BookNum].borrownum << endl;
		myFile.close();
		BookNum++;//录入完毕,记录数加一
	}
}

void AddBook()
{
	while (1)
	{
		InputBox(books[BookNum].title, 20, "请输入需要录入的图书名称:");//显示一个输入框,
		if (BookFormat(books[BookNum].title))//为真跳出循环
		{
			break;
		}
	}
	while (1)
	{
		InputBox(books[BookNum].author, 20, "请输入需要录入的图书作者名称:");//显示一个输入框,
		if (BookFormat(books[BookNum].author))//为真跳出循环
		{
			break;
		}
	}
	while (1)
	{
		InputBox(books[BookNum].totalnum, 20, "请输入需要录入的图书总数为:");//显示一个输入框,
		if (BookFormat(books[BookNum].totalnum))//为真跳出循环
		{
			break;
		}
	}
	while (1)
	{
		InputBox(books[BookNum].borrownum, 20, "请输入需要录入的图书总数为:");//显示一个输入框,
		if (BookFormat(books[BookNum].borrownum))//为真跳出循环
		{
			break;
		}
	}
	SaveInfor();

}

void FindBook()
{
	int Position = ReturnPosition();
	initgraph(1170, 869);
	IMAGE img_bk;
	loadimage(&img_bk, "./bk3.jpg");
	cleardevice();//清屏
	BeginBatchDraw();//开始批量绘图
	putimage(0, 0, &img_bk);//展示背景图片
	setbkmode(TRANSPARENT);//设置背景模式透明

	//标题
	char SecondTitle[20] = "查找图书界面";
	settextstyle(40, 0, "华文行楷");
	outtextxy(0, 0, SecondTitle);

	settextstyle(30, 0, "隶书");
	settextcolor(BLACK);
	outtextxy(150, 30, "图书名称");
	outtextxy(450, 30, "作者");
	outtextxy(680, 30, "图书总数");
	outtextxy(900, 30, "借阅数");

	if (Position == -1)//没找到
	{
		//获取窗口句柄
		HWND hndtipsM = GetHWnd();
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsM, "抱歉,没有这本书!", "提示", MB_OK);
	}
	else
	{
		//打印找到的信息
		outtextxy(150, 80, books[Position].title);//输出书名
		outtextxy(450, 80, books[Position].author);
		outtextxy(680, 80, books[Position].totalnum);
		outtextxy(900, 80, books[Position].borrownum);
	}

	setfillcolor(RGB(56, 242, 212));
	fillrectangle(380, 700, 800, 750);
	settextcolor(BLACK);
	settextstyle(40, 0, "隶书");
	char SecondSelect5[20] = { "返回" };
	outtextxy(395, 705, SecondSelect5);

	FlushBatchDraw();
	EndBatchDraw();


	//定义第三个鼠标操作
	MOUSEMSG m4;
	while (1)
	{
		m4 = GetMouseMsg();
		if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
		{
			setlinecolor(RED);
			rectangle(380, 700, 800, 750);
			if (m4.uMsg == WM_LBUTTONDOWN)
			{
				//返回
				UserPage();
			}
		}
		else
		{
			setlinecolor(WHITE);
			rectangle(380, 700, 800, 750);
		}
	}
}

void addstring(char s1[], char s2[])
{
	int i = atoi(s1);
	int j = atoi(s2);
	int sum = i + j;
	sprintf(s1, "%d", sum);
}

void BorrowBook()
{
	//定义一个变量用来接收下标
	int TempBorr = ReturnPosition();

	if (TempBorr == -1)//没找到
	{
		//获取窗口句柄
		HWND hndtipsF = GetHWnd();
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsF, "无法借阅!", "提示", MB_OK);
	}
	else//找到了——将借阅出去的图书信息存储到另一个文件中,归还时重新读入
	{
		initgraph(1170, 869);
		cleardevice();//清屏
		IMAGE img_bk;
		loadimage(&img_bk, "./bk3.jpg");
		BeginBatchDraw();//开始批量绘图
		putimage(0, 0, &img_bk);//展示背景图片
		setbkmode(TRANSPARENT);//设置背景模式透明

		//标题
		char SecondTitle[20] = "图书借阅界面";
		settextstyle(40, 0, "华文行楷");
		outtextxy(0, 0, SecondTitle);

		if (strlen(books[TempBorr].title) != 0 && strlen(books[TempBorr].author) != 0)
		{
			addstring(books[TempBorr].borrownum, s);
			fstream myFile;
			myFile.open("borrow.txt", ios::app);  // append,追加
			//myFile.open("data.txt", ios::trunc);  //- 删除现有文件中的数据
			myFile << books[TempBorr].title << " "
				<< books[TempBorr].author << endl;
			myFile.close();//关闭文件
		}
		SaveAlter();
		HWND hndtipsF = GetHWnd();
		int isok = MessageBox(hndtipsF, "借阅成功", "提示", MB_OK);
		RecordNum++;


		settextstyle(30, 0, "隶书");
		settextcolor(BLACK);
		outtextxy(150, 30, "图书名称");
		outtextxy(450, 30, "作者");

		ReadIn2();
		//打印找到的信息
		for (int i = 1; i <= RecordNum; i++)
		{
			//缩放字体
			settextstyle(25, 0, "隶书");
			outtextxy(150, 40 + 40 * i, bobooks[i - 1].title);//输出书名
			outtextxy(450, 40 + 40 * i, bobooks[i - 1].author);//作者
		}

		setfillcolor(RGB(191, 149, 214));
		fillrectangle(380, 620, 800, 670);
		fillrectangle(380, 700, 800, 750);
		settextcolor(BLACK);
		settextstyle(40, 0, "隶书");
		char SecondSelect4[20] = { "继续借阅" };
		char SecondSelect5[20] = { "返回" };
		outtextxy(395, 625, SecondSelect4);
		outtextxy(395, 705, SecondSelect5);

		FlushBatchDraw();
		EndBatchDraw();


		//定义第三个鼠标操作
		MOUSEMSG m4;
		while (1)
		{
			m4 = GetMouseMsg();
			if (m4.x >= 380 && m4.x <= 800 && m4.y >= 620 && m4.y <= 670)
			{
				setlinecolor(RED);
				rectangle(380, 620, 800, 670);
				if (m4.uMsg == WM_LBUTTONDOWN)
				{
					//继续借阅
					BorrowBook();
				}
			}
			if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
			{
				setlinecolor(RED);
				rectangle(380, 700, 800, 750);
				if (m4.uMsg == WM_LBUTTONDOWN)
				{
					//返回
					cleardevice();
					UserPage();
				}
			}
			else
			{
				setlinecolor(WHITE);
				rectangle(380, 620, 800, 670);
				rectangle(380, 700, 800, 750);
			}
		}

	}
}

int RePosition()
{
	//接受用户输入
	char ReceInput[64];
	InputBox(ReceInput, 100, "请输入书名或者作者名进行操作");//显示一个输入框
	for (int w = 0; w < BookNum; w++)//进行循环查找,一旦相同就跳出循环
	{
		if (strcmp(books[w].title, ReceInput) == 0 || strcmp(books[w].author, ReceInput) == 0)//返回0表示两个字符串相等
		{
			return w;
		}
		//strcmp用法:
		/*该函数返回值如下:
如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。*/
	}
	//如果没找到就返回-1
	return -1;
}

void ReturnBook()
{
	int TempBorr = RePosition();
	if (TempBorr == -1)//没找到
	{
		//获取窗口句柄
		HWND hndtipsF = GetHWnd();//获得窗口句柄
		//在 Windows 下,句柄是一个窗口的标识
		//得到句柄后,可以使用 Windows API 中的函数实现对窗口的控制。
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsF, "归还失败!", "提示", MB_OK);
	}
	else//找到了——将借阅出去的图书信息存储到另一个文件中,归还时重新读入
	{
		fstream myFile;
		myFile.open("Return.txt", ios::out);//写入
		for (int i = 0; i < RecordNum; i++)
		{
			if (strlen(bobooks[i].title) != 0 && strlen(bobooks[i].author) != 0)
			{
				myFile << bobooks[i].title << " "
					<< bobooks[i].author << endl;
			}
		}
		myFile.close();
		HWND hndtipsF = GetHWnd();
		int isok = MessageBox(hndtipsF, "归还成功", "提示", MB_OK);
	}
}

void UserInforPage()
{
	initgraph(1170, 869);
	IMAGE img_bk;
	loadimage(&img_bk, "./bk3.jpg");
	cleardevice();//清屏
	BeginBatchDraw();//开始批量绘图
	putimage(0, 0, &img_bk);//展示背景图片
	setbkmode(TRANSPARENT);//设置背景模式透明

	//标题
	char SecondTitle[20] = "用户信息界面";
	settextstyle(40, 0, "华文行楷");
	outtextxy(0, 0, SecondTitle);

	settextcolor(BLACK);
	settextstyle(50, 0, "隶书");
	outtextxy(30, 30, "借阅过的图书");
	outtextxy(30, 350, "归还的图书");

	//借阅
	settextstyle(30, 0, "隶书");
	outtextxy(60, 70, "图书名称");
	outtextxy(400, 70, "作者");

	//归还
	outtextxy(60, 390, "图书名称");
	outtextxy(400, 390, "作者");

	ReadIn2();
	if (RecordNum == 0)
	{
		settextstyle(50, 0, "隶书");
		outtextxy(200, 200, "当前记录为空!");
		return;
	}
	for (int i = 1; i <= RecordNum; i++)
	{
		//缩放字体
		settextstyle(25, 0, "隶书");
		outtextxy(60, 100 + 30 * i, bobooks[i - 1].title);//输出书名
		outtextxy(400, 100 + 30 * i, bobooks[i - 1].author);//作者
	}

	ReadIn3();
	if (ReturnNum == 0)
	{
		settextstyle(50, 0, "隶书");
		outtextxy(200, 200, "当前记录为空!");
		return;
	}
	for (int i = 1; i <= ReturnNum; i++)
	{
		//缩放字体
		settextstyle(25, 0, "隶书");
		outtextxy(60, 420 + 30 * i, rebooks[i - 1].title);//输出书名
		outtextxy(400, 420 + 30 * i, rebooks[i - 1].author);//作者
	}

	setfillcolor(RGB(191, 149, 214));
	fillrectangle(380, 700, 800, 750);
	settextcolor(BLACK);
	settextstyle(40, 0, "隶书");
	char SecondSelect5[20] = { "返回" };
	outtextxy(395, 705, SecondSelect5);

	FlushBatchDraw();
	EndBatchDraw();

	//定义第三个鼠标操作
	MOUSEMSG m4;
	while (1)
	{
		m4 = GetMouseMsg();
		if (m4.x >= 380 && m4.x <= 800 && m4.y >= 700 && m4.y <= 750)
		{
			setlinecolor(RED);
			rectangle(380, 700, 800, 750);
			if (m4.uMsg == WM_LBUTTONDOWN)
			{
				//返回
				UserPage();
			}
		}
		else
		{
			setlinecolor(WHITE);
			rectangle(380, 700, 800, 750);
		}
	}
}

int main()
{
	ReadIn();
	FirstPage();
}

有很多的bug,但是可以应付答辩,还有存储图书信息文本的截图

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值