用EasyX+c写简单的图书管理系统

  利用vs2019写的,期间参考了其他博主的代码。

  大致流程,定义一个Book结构体,将图书名称、作者名、出版社名称等信息存储到这个结构体类型的变量当中,再创建一个结构体数组,用于存储不同类型的结构体变量,进而满足对不同类型的图书信息的存储和读取。用宏定义来声明结构体数组数量,定义专门的变量来记录当前系统录入了多少条的图书信息。创建一个管理员结构体,即管理员用户,加上登录检测,用来限制权限,普通用户无法对系统中存储的图书信息进行添加、删除、修改这些操作,只能进行基本的浏览、查询和借阅。每次打开系统都会自动的读取隶属于不同功能下的文件,如果有属于各个结构体上的信息,系统会自动识别并将数据读入到对应的结构体数组当中。

  录入信息时会自动将录入的信息添加到文件末尾;查询可以通过图书名称和作者名字这些信息来搜索与之对应的图书;搜索到指定的书籍后,可以删除指定图书的所有信息;显示全部数据即在系统界面上直接打印输出图书管理系统中所有的图书信息供使用者浏览;修改功能可以指定位置修改,也可以先删除后添加的修改,前者在输入过要修改的内容过后会直接覆盖掉修改之前的数据。

 根据该结构图并结合Easy x图形库可以搭建出系统的大致框架,之后再利用c语言层层推进,逐渐细分,利用不同的结构体函数来代表不同的功能,再进行组合应用,继而来实现各个模块的不同功能需求(本来想用链表的,但是指针老是出错,暂时放弃了,裂开),最终得到一个完整的程序。

效果图

 

 

 

 代码

#include<graphics.h>
#include<conio.h>
#include <stdio.h>
#include <stdlib.h>//动态分配内存
#include<string.h>
#include<ctype.h>//检测字符
#include<stdbool.h>

#define RecordNums 15//结构体数组数量
int NowBookNums = 0;//当前记录了多少条图书信息
int BorrowNums = 0; //借出了多少图书


//用结构体数组和文件操作来实现
//定义结构体
typedef struct Book
{
	char title[128];//书名
	char author[20];//作者
	char press[128];//出版社
}Book;

//创建图书结构体数组
Book LibraryArry[RecordNums];

//创建管理员结构体
typedef struct Admin
{
	char UserName[64];
	char PassWord[64];
}Admin;

typedef struct Return
{
	char title[128];
	char author[20];
	char press[128];

}Return;
//创建归还图书的结构体数组
Return ReturnArry[RecordNums];

//创建一个管理员用户
Admin AdminUser;

//显示全部数据的页面跳转标识
int FlagAI = -1;
//查询找到页面跳转标识
int FlagFPT = -1;
/*
	1.先搭出图形窗口的大致形态
	2.逐步实现里面的内容
*/
IMAGE img_bk;//背景图片

//函数声明
void Startup();
void FirstPage();
void updateWithoutInput();//有关
void updateWithInput();//与用户输入有关的更新
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();//归还图书


void Startup()//初始化数据
{
	initgraph(760, 760);
	loadimage(&img_bk, "bk1.jpg",760,760);//读取图片
}
void FirstPage()//首页画面
{
	//进入程序首先读取数据——获得当前NowBookNums
	ReadInfor();

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

	//大标题
	char FirstTitle[20] = { "图书信息管理系统" };
	settextstyle(60, 0, "黑体");
	outtextxy (150,100,FirstTitle);

	//首页三个选项的背景
	fillrectangle(230, 445, 560, 490);
	fillrectangle(230, 505, 560, 550);
	fillrectangle(230, 565, 560, 610);

	setbkmode(TRANSPARENT);

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

	//首页三个选项
	char FirstSelect1[20] = { "管理员操作界面" };
	char FirstSelect2[20] = { "普通用户操作界面" };
	char FirstSelect3[20] = { "退出系统" };
	outtextxy (240, 450, FirstSelect1);
	outtextxy (240, 510, FirstSelect2);
	outtextxy (240, 570, FirstSelect3);

	FlushBatchDraw();
	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);
		}
	}
}


//管理员界面
void AdminPage()
{
	
	initgraph(760,760);
	cleardevice();//清屏函数
	//定义第二个鼠标操作
	MOUSEMSG m2;

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

	char SecondTitle1 [5] = { "管" };
	char SecondTitle2 [5] = { "理" };
	char SecondTitle3 [5] = { "员" };
	char SecondTitle4 [5] = { "操" };
	char SecondTitle5 [5] = { "作" };
	char SecondTitle6 [5] = { "界" };
	char SecondTitle7 [5] = { "面" };


	settextstyle(50, 0, "黑体");
	outtextxy(50,150, SecondTitle1);
	outtextxy(50,210, SecondTitle2);
	outtextxy(50,270, SecondTitle3);
	outtextxy(50,330, SecondTitle4);
	outtextxy(50,390, SecondTitle5);
	outtextxy(50,450, SecondTitle6);
	outtextxy(50,510, SecondTitle7);


	setbkmode(TRANSPARENT);


	//三个选项的背景
	fillrectangle(230, 240, 560, 285);
	fillrectangle(230, 370, 560, 415);
	fillrectangle(230, 500, 560, 545);

	setbkmode(TRANSPARENT);

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

	//三个选项
	char SecondSelect1[20] = { "显示所有数据" };
	char SecondSelect2[20] = { "增删查改数据" };
	char SecondSelect3[20] = { "返回" };


	outtextxy(270, 240, SecondSelect1);
	outtextxy(270, 370, SecondSelect2);
	outtextxy(350, 500, SecondSelect3);

	FlushBatchDraw();
	//进入主界面选项操作界面
	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;
				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);
		}
	}
}

//普通用户界面
void CommonUserPage()
{
	initgraph(760, 760);
	cleardevice();
	//定义第三个鼠标操作
	MOUSEMSG m3;

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

	setfillcolor(GREEN);

	char SecondTitle1[5] = { "普" };
	char SecondTitle2[5] = { "通" };
	char SecondTitle3[5] = { "用" };
	char SecondTitle4[5] = { "户" };
	char SecondTitle5[5] = { "操" };
	char SecondTitle6[5] = { "作" };
	char SecondTitle7[5] = { "界" };
	char SecondTitle8[5] = { "面" };


	settextstyle(50, 0, "黑体");
	outtextxy(50, 150, SecondTitle1);
	outtextxy(50, 210, SecondTitle2);
	outtextxy(50, 270, SecondTitle3);
	outtextxy(50, 330, SecondTitle4);
	outtextxy(50, 390, SecondTitle5);
	outtextxy(50, 450, SecondTitle6);
	outtextxy(50, 510, SecondTitle7);
	outtextxy(50, 570, SecondTitle8);


	setbkmode(TRANSPARENT);


	//三个选项的背景

	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, "黑体");

	//三个选项
	char ThirdSelect1[20] = { "显示所有数据" };
	char ThirdSelect2[20] = { "查询数据" };
	char ThirdSelect3[20] = { "借阅、归还" };
	char ThirdSelect4[20] = { "返回" };



	outtextxy(310, 160, ThirdSelect1);
	outtextxy(320, 310, ThirdSelect2);
	outtextxy(320, 460, ThirdSelect3);
	outtextxy(350, 610, ThirdSelect4);


	FlushBatchDraw();
	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);
		}
	}
}

void InputInfor()//图书信息录入
{
	while (1)
	{
		TCHAR InputWindow0[] =_T("请输入需要录入的图书名称:");
		InputBox(LibraryArry[NowBookNums].title, 20, InputWindow0);//显示一个输入框,
		if (BookFormat(LibraryArry[NowBookNums].title))//为真跳出循环
		{
			break;
		}
	}
	while (1)
	{
		TCHAR InputWindow1[] = _T("请输入需要录入的图书作者名称:");
		InputBox(LibraryArry[NowBookNums].author, 20, InputWindow1);//显示一个输入框,
		if (BookFormat(LibraryArry[NowBookNums].author))//为真跳出循环
		{
			break;
		}
	}
	while (1)
	{
		TCHAR InputWindow2[] = _T("请输入需要录入的图书出版社为:");
		InputBox(LibraryArry[NowBookNums].press, 20, InputWindow2);//显示一个输入框,
		if (BookFormat(LibraryArry[NowBookNums].press))//为真跳出循环
		{
			break;
		}
	}

	SaveInfor();
}

//判断输入的图书名字格式是否正确
bool BookFormat(char PerStr[])
{
	return true;
}
//保存数据到文件中
void SaveInfor()
{
	if (strlen(LibraryArry[NowBookNums].title) != 0&& strlen(LibraryArry[NowBookNums].author) != 0&& strlen(LibraryArry[NowBookNums].press) != 0)
	{
		FILE* fp = fopen("data.txt", "a");//a向文本文件尾添加数据
		if (fp == NULL)
		{
			return;
		}
		fprintf(fp,"%s ", LibraryArry[NowBookNums].title);
		fprintf(fp,"%s ", LibraryArry[NowBookNums].author);
		fprintf(fp,"%s ", LibraryArry[NowBookNums].press);

		fclose(fp);//关闭文件
		NowBookNums++;//录入完毕,记录数加一
	}
}
//抹除全部数据再保存——主要用于修改功能
void SaveInforModi()
{
	//先删掉,但是不将人数置空所以不能调用之前的删除函数
	remove("data.txt");
	FILE* fp = fopen("data.txt", "a+");
	if (fp == NULL)
	{
		return;
	}
	for (int i = 0; i < NowBookNums; i++)
	{
		if (strlen(LibraryArry[i].title) != 0 && strlen(LibraryArry[i].author) != 0 && strlen(LibraryArry[i].press) != 0)
		{

			fprintf(fp, "%s\t%s\t%s\n",
				LibraryArry[i].title,
				LibraryArry[i].author,
				LibraryArry[i].press);
		}
	}

	fclose(fp);
}
//读取文件中的信息,同步到结构体数组中
void ReadInfor()
{
	FILE* fp = fopen("data.txt", "r");//只读模式
	if (fp == NULL)
	{
		return;
	}
	//将文件中的数据读取到当前的结构体数组中
	for (int i = 0; i < RecordNums; i++)
	{
		fscanf(fp,"%s\t%s\t%s\n ", LibraryArry[i].title, LibraryArry[i].author,LibraryArry[i].press);
	}
	int FileBookNums = 0;//文件中的记录数
	for (int k = 0; k < RecordNums; k++)
	{
		if (strlen(LibraryArry[k].title) != 0)
		{
			//当前人数——FileBookNums不能设全局变量,否则多次读取的时候会出现问题
			NowBookNums = ++FileBookNums;
		}
	}
	fclose(fp);
}

//增删改查界面
void AdDeSeMoPage()
{
	BeginBatchDraw();
	initgraph(760, 760);
	cleardevice();
	//定义鼠标操作
	MOUSEMSG SL;

	cleardevice();
	IMAGE img_bk;
	loadimage(&img_bk, "bk1.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(200, 0, "作者");
	outtextxy(400, 0, "出版社");
	outtextxy(650, 30, "选项");
	outtextxy(650, 100, "添加");
	outtextxy(650, 200, "删除");
	outtextxy(650, 300, "查找");
	outtextxy(650, 400, "修改");
	outtextxy(650, 500, "清空");
	outtextxy(650, 600, "返回");

	FlushBatchDraw();
	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 q = 1; q <= NowBookNums; q++)
	{


		//顺序
		settextstyle(30, 0, "黑体");
		char Nums[5];
		sprintf(Nums, "%d", q);

		//缩放字体
		settextstyle(25, 0, "黑体");

		outtextxy(0, 40 + 40 * q, LibraryArry[q - 1].title);//输出书名
		outtextxy(200, 40 + 40 * q, LibraryArry[q - 1].author);
		outtextxy(400, 40 + 40 * q, LibraryArry[q - 1].press);
	}
}

//显示所有数据
void ShowAllInfor()
{
	BeginBatchDraw();
	initgraph(760, 760);
	cleardevice();
	//定义第三个鼠标操作
	MOUSEMSG SA;

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

    setfillcolor(GREEN);

	fillrectangle(640, 590, 720, 640);//

	settextstyle(30, 0, "黑体");
	outtextxy(0, 0, "图书名称");
	outtextxy(200, 0, "作者");
	outtextxy(400, 0, "出版社");

	outtextxy(650, 600, "返回");
	SimplePrint();//打印
	FlushBatchDraw();
	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();
				}
				if (FlagAI == 1)
				{
					CommonUserPage();
				}
			}
		}
	}
}

//返回要查找、修改、删除人所在的结构体的下标
int ReturnPosition()
{
	//接受用户输入
	char ReceInput[64];
	TCHAR InputWindowFI[] = _T("请输入书名或者作者名进行操作");
	InputBox(ReceInput, 10, InputWindowFI);//显示一个输入框

	//进行循环查找,一旦相同就跳出循环
	for (int w = 0; w < NowBookNums; w++)
	{
		if (strcmp(LibraryArry[w].title, ReceInput) == 0 || strcmp(LibraryArry[w].author, ReceInput) == 0)//返回0表示两个字符串相等
		{
			return w;
		}
	}
	//如果没找到就返回-1
	return -1;
}
int RePosition()//借阅结构体下标
{
	//接受用户输入
	char ReceInput[64];
	TCHAR InputWindowFR[] = _T("请输入书名或者作者名进行操作");
	InputBox(ReceInput, 10, InputWindowFR);//显示一个输入框

	//进行循环查找,一旦相同就跳出循环
	for (int w = 0; w < BorrowNums; w++)
	{
		if (strcmp(ReturnArry[w].title, ReceInput) == 0 || strcmp(ReturnArry[w].author, ReceInput) == 0)//返回0表示两个字符串相等
		{
			return w;
		}
	}
	//如果没找到就返回-1
	return -1;
}
//打印找到的信息
void PrintFoudInfor(int Position)
{
	BeginBatchDraw();
	initgraph(760, 760);
	cleardevice();
	//定义第三个鼠标操作
	MOUSEMSG PFI;

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

	setfillcolor(GREEN);

	fillrectangle(640, 590, 720, 640);//

	settextstyle(30, 0, "黑体");
	outtextxy(0, 0, "图书名称");
	outtextxy(200, 0, "作者");
	outtextxy(400, 0, "出版社");
	outtextxy(650, 600, "返回");

	//打印找到的信息
	outtextxy(0, 80, LibraryArry[Position].title);//输出书名
	outtextxy(200,80, LibraryArry[Position].author);
	outtextxy(400, 80, LibraryArry[Position].press);
	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();
	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, "bk1.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(200, 70, "作者");
		outtextxy(400, 70, "出版社");
		outtextxy(650, 600, "返回");
		//修改后
		outtextxy(0, 410, "图书名称");
		outtextxy(200, 410, "作者");
		outtextxy(400, 410, "出版社");
		outtextxy(650, 600, "返回");

		//打印找到的信息
		outtextxy(0, 110, LibraryArry[TempModi].title);//输出书名
		outtextxy(200, 110, LibraryArry[TempModi].author);
		outtextxy(400, 110, LibraryArry[TempModi].press);

		FlushBatchDraw();
		EndBatchDraw();

		while (1)
		{
			//接收输入的修改后的值覆盖进去
			char TempModiNums[64];

			TCHAR InputWindow0[] = _T("请输入修改后的书名");
			InputBox(LibraryArry[TempModi].title, 20, InputWindow0);

			if (BookFormat(LibraryArry[TempModi].title))
			{
				break;
			}
			
		}

		while (1)
		{
			//接收输入的修改后的值覆盖进去
			char TempModiNums[64];

			TCHAR InputWindow1[] = _T("请输入修改后的作者名");
			InputBox(LibraryArry[TempModi].author, 20, InputWindow1);

			if (BookFormat(LibraryArry[TempModi].author))
			{
				break;
			}

		}

		while (1)
		{
			//接收输入的修改后的值覆盖进去
			char TempModiNums[64];

			TCHAR InputWindow2[] = _T("请输入修改后的出版社");
			InputBox(LibraryArry[TempModi].press, 20, InputWindow2);

			if (BookFormat(LibraryArry[TempModi].press))
			{
				break;
			}

		}
		outtextxy(0, 410, LibraryArry[TempModi].title);//输出书名
		outtextxy(200, 410, LibraryArry[TempModi].author);
		outtextxy(400, 410, LibraryArry[TempModi].press);
		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, "bk1.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, "黑体");

	//三个选项
	
	char ThirdSelect2[20] = { "借阅图书" };
	char ThirdSelect3[20] = { "归还图书" };
	char ThirdSelect4[20] = { "返回" };



	outtextxy(320, 310, ThirdSelect2);
	outtextxy(320, 460, ThirdSelect3);
	outtextxy(350, 610, ThirdSelect4);


	FlushBatchDraw();
	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)//没找到
	{
		//获取窗口句柄
		HWND hndtipsF = GetHWnd();
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsF, "系统未录入此图书,无法借阅!", "提示", MB_OK);
	}
	else//找到了——将借阅出去的图书信息存储到另一个文件中,归还时重新读入
	{
		if (strlen(LibraryArry[TempBorr].title) != 0 && strlen(LibraryArry[TempBorr].author) != 0 && strlen(LibraryArry[TempBorr].press) != 0)
		{
			FILE* fp = fopen("Borrow.txt", "a+");

			fprintf(fp, "%s ", LibraryArry[TempBorr].title);
			fprintf(fp, "%s ", LibraryArry[TempBorr].author);
			fprintf(fp, "%s", LibraryArry[TempBorr].press);

			fclose(fp);//关闭文件
		}
		for (int x = TempBorr; x < NowBookNums ; x++)
		{
			LibraryArry[x] = LibraryArry[x + 1];
		}
		NowBookNums--;
		SaveInforModi();
		
		HWND hndtipsF = GetHWnd();
		int isok = MessageBox(hndtipsF, "借阅成功", "提示", MB_OK);
	}
}

//归还图书
void ReturnBook()
{
	//将Borrow文件中的信息读取到数组中
	FILE* fp = fopen("Borrow.txt", "r");//只读模式
	if (fp == NULL)
	{
		return;
	}
	//将文件中的数据读取到当前的结构体数组中
	for (int i = 0; i < RecordNums; i++)
	{
		fscanf(fp, "%s\t%s\t%s\n ", ReturnArry[i].title, ReturnArry[i].author, ReturnArry[i].press);
	}
	int FileBookNums = 0;//文件中的记录数
	for (int k = 0; k < RecordNums; k++)
	{
		if (strlen(ReturnArry[k].title) != 0)
		{
			//当前人数——FileBookNums不能设全局变量,否则多次读取的时候会出现问题
			BorrowNums = ++FileBookNums;
		}
	}
	fclose(fp);
	//定义一个变量用来接收下标
	int TempBorr = RePosition();

	if (TempBorr == -1)//没找到
	{
		//获取窗口句柄
		HWND hndtipsF = GetHWnd();
		//用一个字符数组来总结句子
		int isok = MessageBox(hndtipsF, "归还失败!", "提示", MB_OK);
	}
	else//找到了——将借阅出去的图书信息存储到另一个文件中,归还时重新读入
	{
		if (strlen(ReturnArry[TempBorr].title) != 0 && strlen(ReturnArry[TempBorr].author) != 0 && strlen(ReturnArry[TempBorr].press) != 0)
		{
			FILE* fp = fopen("data.txt", "a+");

			fprintf(fp, "%s ", ReturnArry[TempBorr].title);
			fprintf(fp, "%s ", ReturnArry[TempBorr].author);
			fprintf(fp, "%s", ReturnArry[TempBorr].press);

			fclose(fp);//关闭文件
		}
		for (int x = TempBorr; x < BorrowNums; x++)
		{
			ReturnArry[x] = ReturnArry[x + 1];
		}
		BorrowNums--;
		//先删掉,但是不将人数置空所以不能调用之前的删除函数
		remove("Borrow.txt");
		FILE* fp = fopen("Borrow.txt", "a+");
		if (fp == NULL)
		{
			return;
		}
		for (int i = 0; i < BorrowNums; i++)
		{
			if (strlen(ReturnArry[i].title) != 0 && strlen(ReturnArry[i].author) != 0 && strlen(ReturnArry[i].press) != 0)
			{

				fprintf(fp, "%s\t%s\t%s\n",
					ReturnArry[i].title,
					ReturnArry[i].author,
					ReturnArry[i].press);
			}
		}

		fclose(fp);

		HWND hndtipsF = GetHWnd();
		int isok = MessageBox(hndtipsF, "归还成功", "提示", MB_OK);
	}
}

//彻底清空,删除文件
void DeleteBookInfor()
{
	remove("data.txt");

	//置空当前纪录信息数
	NowBookNums = 0;
}

//管理员登录
void AdminSignIn()
{
	//打开文件将账号和密码读过来
	FILE* fp = fopen("AdminSignIn.txt", "r");
	if (fp == NULL)
	{
		return;
	}
	//读取到对应的管理员结构体数组
	fscanf(fp, "%s\t%s\t\n", AdminUser.UserName, AdminUser.PassWord);

	//关闭文件
	fclose(fp);



	char ReceAcctNumber[64];
	TCHAR InputAcct[] = _T("请输入用户名");
	InputBox(ReceAcctNumber, 10, InputAcct);

	char ReceAcctPassWord[64];
	TCHAR InputPass[] = _T("请输入密码");
	InputBox(ReceAcctPassWord, 10, InputPass);

	//如果用户名和密码都正确才进度到管理员界面
	//否则弹窗提示错误
	if (strcmp(AdminUser.UserName, ReceAcctNumber) == 0 && strcmp(AdminUser.PassWord, ReceAcctPassWord) == 0)
	{
		cleardevice();
		AdminPage();
	}
	else
	{
		HWND SignError = GetHWnd();
		int isok = MessageBox(SignError, "用户名或密码错误!", "提示", MB_OK);
	}
}

int main(void)
{
	Startup();//数据初始化
	while (1)
	{
		FirstPage();//显示画面 
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值