功能框架图:
整体源码在文章最后,这个系统搭架定义了一些全局变量,且系统功能都要调用文件函数,效率低下,优化可根据自行改为使用线性表,数据库等,此代码适用纯C语言阶段学习。
总体框架的搭建:
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#define BOOK_NUM 200
#define READER_NUM 200
#define BOOK_DATA astBook[i].iNum,astBook[i].acName,astBook[i].acAuthor,astBook[i].acPress,astBook[i].iAmount
#define READER_DATA astReader[i].iNum,astReader[i].acName,astReader[i].acSex,astReader[i].iMax,astReader[i].iAmount
//定义别名方便后续文件操作写入信息
#define LEN_BOOK sizeof(struct Book) //结构体大小
#define LEN_READER sizeof(struct Reader)
struct Book
{
int iNum; //图书编号
char acName[15];//图书名称
char acAuthor[15];//图书作者
char acPress[15]; //图书出版社
int iAmount; //图书库存
};
struct Reader
{
int iNum;//读者编号
char acName[15];//读者姓名
char acSex[4];//读者性别
int iMax;//读者最大可阅读数量
int iAmount;//读者当前可借阅的数量
int Bookld[10];//读者已经借阅的图书
};
//定义两个全局结构体数组来记录所有图书信息和所有读者信息
struct Book astBook[BOOK_NUM];
struct Reader astReader[READER_NUM];
//显示主菜单
void Meau()
{
//清屏函数
system("cls");
printf("\n\n");
printf("——————————————————————————\n");
printf("********************欢迎进入图书馆******************\n");
printf("********************图书馆管理系统******************\n");
printf("************************主菜单**********************\n");
printf("*********************1.图书管理*********************\n");
printf("*********************2.读者管理*********************\n");
printf("*********************3.登记借还书*******************\n");
printf("*********************0.退出系统*********************\n");
printf("——————————————————————————");
printf("\n");
printf("请选择(0-3)");
}
//中间是三大板块的实现-------
int main()
{
//显示主函数界面
Meau();
int num;
scanf("%d", &num);
while (num)
{
switch (num)
{
case 1:
ManageBook();//图书管理模块
break;
case 2:
ManageReader();//读者管理模块
break;
case 3:
ManageBorrowReturn();//借还书管理模块
break;
default:
printf("请输入正确选项!\n程序将于3秒后跳转主菜单");
Sleep(3000);
}
Meau();
scanf("%d", &num);
getchar();
}
return 0;
}
图书管理实现:
设置图书管理选项子菜单,保存图书信息文件函数,进行增删改查
void ShowBookMenu()//显示书籍管理子菜单
{
//清屏函数
system("cls");
printf("\n\n");
printf("—————————————————————————————\n");
printf("|********************欢迎进入图书馆**********************|\n");
printf("|********************图书馆管理系统**********************|\n");
printf("|**********************图书子菜单************************|\n");
printf("|********************1.显示图书信息**********************|\n");
printf("|********************2.新增图书信息**********************|\n");
printf("|********************3.查找图书信息**********************|\n");
printf("|********************4.删除图书信息**********************|\n");
printf("|********************5.修改图书信息**********************|\n");
printf("|********************0.返回主菜单************************|\n");
printf("—————————————————————————————");
printf("\n");
printf("请选择(0-5)");
}
int ReadBookFile(const char* pcMode)//读取图书文件
{
int iBookRecord = 0;
FILE* pfBook; //文件指针
pfBook = fopen("book.txt", pcMode);
if (pfBook == NULL)
{
return -1;
}
while (!feof(pfBook))
{
if(fread(&astBook[iBookRecord],LEN_BOOK,1,pfBook))
{
iBookRecord++;
}
}
fclose(pfBook);
return iBookRecord;
}
void ShowBook()//显示图书信息
{
int i, iBookRecord;//记录条数
system("cls");
iBookRecord = ReadBookFile("rb");//从文件中只读
if (iBookRecord == -1)
{
printf("改文件打开失败,请先新增图书信息!\n");
}
if (iBookRecord == 0)
{
printf("文件中没有图书信息!\n");
}
else
{
printf("\n\n");
printf("—————————————————————————————————\n");
printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "书名", "作者", "出版社", "库存");
for (i = 0; i < iBookRecord; i++)
{
printf("%-10d%-16s%-16s%-18s%-6d\n",BOOK_DATA);
printf("—————————————————————————————————\n");
}
printf("\n");
}
}
void AddBook()//新增图书信息
{
FILE* pfBook;
int iBookRecord, iFlagExist, i;
char cFlag;
system("cls");
iBookRecord = ReadBookFile("ab+");//ab+追加方式打开或者新建二进制文件
if (iBookRecord == -1)
{
printf("文件打开失败!\n");
return;
}
else if (iBookRecord == 0)
{
printf("没有图书记录!\n");
}
else
{
ShowBook();//显示图书信息
}
//循环录入图书信息
printf("请选择是否输入信息(y/n)");
cFlag = getchar();
getchar();//读取回车
if (cFlag == 'n')
{
return;
}
pfBook = fopen("book.txt", "ab+");
if (pfBook == NULL)
{
printf("文件打开失败!\n");
return;
}
while (cFlag == 'y')
{
//录入数据
if (iBookRecord >= BOOK_NUM)
{
printf("记录已满!");
fclose(pfBook);
return;
}
//图书编号不能重复
printf("请输入图书编号:");
do
{
iFlagExist = 0;//标志
scanf("%d", &astBook[iBookRecord].iNum);
getchar();
for (i = 0; i < iBookRecord; i++)
{
if (astBook[i].iNum == astBook[iBookRecord].iNum)
{
iFlagExist = 1;
printf("该图书编号已经存在,请重新输入:");
break;
}
}
} while (iFlagExist == 1);
//图书名称
printf("请输入图书名称:");
scanf("%s", astBook[iBookRecord].acName);
getchar();
//作者
printf("请输入图书作者:");
scanf("%s", astBook[iBookRecord].acAuthor);
getchar();
//出版社
printf("请输入图书出版社:");
scanf("%s", astBook[iBookRecord].acPress);
getchar();
//库存
printf("请输入图书库存:");
scanf("%d", &astBook[iBookRecord].iAmount);
getchar();
//将新增的图书信息写入到文件中
if(fwrite(&astBook[iBookRecord],LEN_BOOK,1,pfBook)!=1)
{
printf("无法保存信息!\n");
return;
}
else
{
printf("%d号图书信息已经保存!\n", astBook[iBookRecord].iNum);
iBookRecord++;
}
printf("是否继续输入信息(y/n)");
cFlag = getchar();
getchar();
}
fclose(pfBook);
printf("添加图书信息执行完毕!\n");
}
int SearchBook()//查找图书信息
{
int iBookNum, iBookRecord, iBookld, i;//要查找的编号,记录条数,记录编号,循环
system("cls");
iBookRecord = ReadBookFile("rb");
if (iBookRecord == -1)
{
printf("文件打开失败!\n");
printf("按任意键返回子菜单!*-*");
_getch();
return -2;//文件打开失败,返回-2
}
else if (iBookRecord == 0)
{
printf("没有图书记录!\n");
printf("按任意键返回子菜单!*-*");
_getch();//接受键盘而不回响
return -3;//没有记录返回-3
}
//进入查找程序
printf("请输入图书编号:");
scanf("%d", &iBookNum);
getchar();
for (i = 0; i < iBookRecord; i++)
{
if (iBookNum == astBook[i].iNum)
{
iBookld = i;//找到记录,返回记录编号
printf("%d号图书信息如下:\n", iBookNum);
printf("—————————————————————————————————\n");
printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "书名", "作者", "出版社", "库存");
printf("%-10d%-16s%-16s%-18s%-6d\n", BOOK_DATA);
printf("—————————————————————————————————\n");
break;
}
}
if (i == iBookRecord)
{
printf("未找到%d号图书信息!\n", iBookNum);
iBookld = -1; //找不到返回-1
}
return iBookld;
}
void DeleteBook()//删除图书信息
{
FILE* pfBook;
int iBookld, iBookRecord, i;
char cFlag;
system("cls");
iBookld = SearchBook();
if (iBookld == -1)
{
return;
}
if (iBookld == -2)
{
printf("文件打开失败!\n");
return;
}
if (iBookld == -3)
{
printf("未查到该记录!\n");
return;
}
iBookRecord = ReadBookFile("rb");
printf("已经找到该图书信息,是否删除(y/n)");
cFlag = getchar();
getchar();
//删除之前保存删除之前的图书编号,输出之后编号信息会被覆盖
int index = astBook[iBookld].iNum;
if (cFlag == 'n')
{
return;
}
else if (cFlag == 'y')
{
for (i = iBookld; i < iBookRecord - 1; i++)
{
astBook[i] = astBook[i + 1];//数组依次前移
}
iBookRecord--;
}
pfBook = fopen("book.txt", "wb");
if (pfBook != NULL)
{
for (i = 0; i < iBookRecord; i++)
{
if (fwrite(&astBook[i], LEN_BOOK, 1, pfBook) != 1)
{
printf("无法保存该信息!\n");
return;
}
}
fclose(pfBook);
printf("%d号图书信息已经删除!\n", index);
}
}
//显示图书修改选项的子菜单
void ShowModifyBookMenu()
{
printf("\n\n");
printf("——————————————————————————\n");
printf("********************1.编号**************************\n");
printf("********************2.书名**************************\n");
printf("********************3.作者**************************\n");
printf("********************4.出版社************************\n");
printf("********************5.图书库存量********************\n");
printf("——————————————————————————\n");
printf("请输入所要修改的信息,请选择(1-5):");
}
//保存修改后图书信息
void SaveBookFile(int iBookld)
{
FILE* pfBook;
pfBook = fopen("book.txt", "rb+");
if (pfBook != NULL)
{
fseek(pfBook, LEN_BOOK * iBookld, SEEK_SET);
if (fwrite(&astBook[iBookld], LEN_BOOK, 1, pfBook) != 1)
{
printf("无法保存该信息!\n");
}
}
fclose(pfBook);
}
void ModifyBook()//修改图书信息
{
int iBookld, iBookRecord, iFlagExist, iltem, iNum, i;//查找到的书籍id,记录条数,标记是否重复,输入选择,修改的编号
system("cls");
iBookld = SearchBook();
if (iBookld== -1)
{
return;
}
if (iBookld == -2)
{
printf("文件打开失败!\n");
return;
}
if (iBookld == -3)
{
printf("未查到该记录!\n");
return;
}
//找到该序号的图书,可以进行修改操作
iBookRecord = ReadBookFile("rb");
//显示修改选项的子菜单
ShowModifyBookMenu();
scanf("%d", &iltem);
getchar();
switch (iltem)
{
case 1:
printf("请输入图书编号:");
do
{
iFlagExist = 0;
scanf("%d", &iNum);
getchar();
for (i = 0; i < iBookRecord; i++)
{
if (iNum == astBook[i].iNum && i != iBookld)
{
iFlagExist = 1;
printf("错误,该图书编号已存在,请重新输入:");
break;
}
}
} while (iFlagExist == 1);
astBook[iBookld].iNum = iNum;
break;
case 2:
printf("请输入图书名称:");
scanf("%s", astBook[iBookld].acName);
getchar();
break;
case 3:
printf("请输入图书作者:");
scanf("%s", astBook[iBookld].acAuthor);
getchar();
break;
case 4:
printf("请输入图书出版社:");
scanf("%s", astBook[iBookld].acPress);
getchar();
break;
case 5:
printf("请输入图书库存量:");
scanf("%d", &astBook[iBookld].iAmount);
getchar();
break;
}
SaveBookFile(iBookld);
printf("图书信息修改成功!\n");
}
void ManageBook()//书籍管理
{
int iltem;
ShowBookMenu();//显示书籍管理子菜单
scanf("%d", &iltem);
getchar();
while (iltem)
{
switch (iltem)
{
case 1:
ShowBook();//显示图书信息
break;
case 2:
AddBook();//新增图书信息
break;
case 3:
SearchBook();//查找图书信息
break;
case 4:
DeleteBook();//删除图书信息
break;
case 5:
ModifyBook();//修改图书信息
break;
default:
printf("请输入正确的选项!");
}
printf("请按任意键返回子菜单*_*");
_getch();//从控件中获取字符而无需回响
ShowBookMenu();//显示书籍管理子菜单
scanf("%d", &iltem);
getchar();
}
}
读者管理实现与图书基本一致:照猫画虎即可
重点在与读者信息的修改,存在读者最大可借阅图书数量和当前可借阅图书数量,若改变其中一个信息,另一个相应要做出改变
void ShowReaderMenu()//显示读者管理子菜单
{
//清屏函数
system("cls");
printf("\n\n");
printf("—————————————————————————————\n");
printf("|********************欢迎进入图书馆**********************|\n");
printf("|********************图书馆管理系统**********************|\n");
printf("|********************* 读者子菜单************************|\n");
printf("|********************1.显示读者信息**********************|\n");
printf("|********************2.新增读者信息**********************|\n");
printf("|********************3.查找读者信息**********************|\n");
printf("|********************4.删除读者信息**********************|\n");
printf("|********************5.修改读者信息**********************|\n");
printf("|********************0.返回主菜单************************|\n");
printf("—————————————————————————————");
printf("\n");
printf("请选择(0-5)");
}
int ReadReaderFile(const char* pcMode)//读取读者信息文件
{
int iReaderRecord = 0;
FILE* pfReader; //文件指针
pfReader = fopen("reader.txt", pcMode);
if (pfReader == NULL)
{
return -1;
}
while (!feof(pfReader))
{
if (fread(&astReader[iReaderRecord], LEN_READER, 1, pfReader))
{
iReaderRecord++;
}
}
fclose(pfReader);
return iReaderRecord;
}
void ShowReader()//显示读者信息
{
int i, iReaderRecord;//记录条数
system("cls");
iReaderRecord = ReadReaderFile("rb");//从文件中只读
if (iReaderRecord == -1)
{
printf("改文件打开失败,请先新增读者信息!\n");
}
if (iReaderRecord == 0)
{
printf("文件中没读者信息!\n");
}
else
{
printf("\n\n");
printf("—————————————————————————————————————\n");
printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "姓名", "性别", "最大可借书数量", "当前可借书数量");
for (i = 0; i < iReaderRecord; i++)
{
printf("%-10d%-16s%-16s%-18d%-6d\n", READER_DATA);
printf("—————————————————————————————————————\n");
}
printf("\n");
}
}
void AddReader()//新增读者信息
{
FILE* pfReader;
int iReaderRecord, iFlagExist, i;
char cFlag;
system("cls");
iReaderRecord = ReadReaderFile("ab+");//ab+追加方式打开或者新建二进制文件
if (iReaderRecord == -1)
{
printf("文件打开失败!\n");
return;
}
else if (iReaderRecord == 0)
{
printf("没有读者记录!\n");
}
else
{
ShowReader();//显示读者信息
}
//循环录入读者信息
printf("请选择是否输入信息(y/n)");
cFlag = getchar();
getchar();//读取回车
if (cFlag == 'n')
{
return;
}
pfReader = fopen("reader.txt", "ab+");
if (pfReader == NULL)
{
printf("文件打开失败!\n");
return;
}
while (cFlag == 'y')
{
//录入数据
if (iReaderRecord >= READER_NUM)
{
printf("记录已满!");
fclose(pfReader);
return;
}
//读者编号不能重复
printf("请输入读者编号:");
do
{
iFlagExist = 0;//标志
scanf("%d", &astReader[iReaderRecord].iNum);
getchar();
for (i = 0; i < iReaderRecord; i++)
{
if (astReader[i].iNum == astReader[iReaderRecord].iNum)
{
iFlagExist = 1;
printf("该读者编号已经存在,请重新输入:");
break;
}
}
} while (iFlagExist == 1);
//读者姓名
printf("请输入读者姓名:");
scanf("%s", astReader[iReaderRecord].acName);
getchar();
//读者性别
printf("请输入读者性别:男or女:");
scanf("%s", astReader[iReaderRecord].acSex);
getchar();
int sex = 1;//标志
while (sex)
{
if (strcmp(astReader[iReaderRecord].acSex, "男") == 0 || strcmp(astReader[iReaderRecord].acSex, "女") == 0)
{
sex = 0;
break;
}
else
{
sex = 1;
printf("读者性别输入错误,请重新输入:");
scanf("%s", astReader[iReaderRecord].acSex);
}
}
//读者最大可阅读数量
printf("请输入读者最大可阅读数量:");//10,范围
scanf("%d", &astReader[iReaderRecord].iMax);
getchar();
//读者当前可借阅的数量
printf("请输入读者当前可借阅的数量:");//新增的读者10,提示,两者必须相等
scanf("%d", &astReader[iReaderRecord].iAmount);
getchar();
//将新增的图书信息写入到文件中
if (fwrite(&astReader[iReaderRecord], LEN_READER, 1, pfReader) != 1)
{
printf("无法保存信息!\n");
return;
}
else
{
printf("%d号读者信息已经保存!\n", astReader[iReaderRecord].iNum);
iReaderRecord++;
}
printf("是否继续输入信息(y/n)");
cFlag = getchar();
getchar();
}
fclose(pfReader);
printf("添加读者信息执行完毕!\n");
}
int SearchReader()//查找读者信息
{
int iReaderNum, iReaderRecord, iReaderld, i;//要查找的编号,记录条数,记录编号,循环
system("cls");
iReaderRecord = ReadReaderFile("rb");
if (iReaderRecord == -1)
{
printf("文件打开失败!\n");
printf("按任意键返回子菜单!*-*");
_getch();
return -2;//文件打开失败,返回-2
}
else if (iReaderRecord == 0)
{
printf("没有读者记录!\n");
printf("按任意键返回子菜单!*-*");
_getch();//接受键盘而不回响
return -3;//没有记录返回-3
}
//进入查找程序
printf("请输入读者编号:");
scanf("%d", &iReaderNum);
getchar();
for (i = 0; i < iReaderRecord; i++)
{
if (iReaderNum == astReader[i].iNum)
{
iReaderld = i;//找到记录,返回记录编号
printf("%d号读者信息如下:\n", iReaderNum);
printf("—————————————————————————————————————\n");
printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "姓名", "性别", "最大可借书数量", "当前可借书数量");
printf("%-10d%-16s%-16s%-18d%-6d\n", READER_DATA);
printf("—————————————————————————————————————\n");
break;
}
}
if (i == iReaderRecord)
{
printf("未找到%d号读者信息!\n", iReaderNum);
iReaderld = -1; //找不到返回-1
}
return iReaderld;
}
void DeleteReader()//删除读者信息
{
FILE* pfReader;//文件指针
int iReaderId, iReaderRecord, i;
char cFlag;
system("cls");
iReaderId = SearchReader();
if (iReaderId == -1)
{
return;
}
iReaderRecord = ReadReaderFile("rb");
printf("已经找到该读者,是否删除?(y/n)");
cFlag = getchar();
getchar();
int index = astReader[iReaderId].iNum;//index保存删除之前的读者编号,因为删除
//之后新的读者编号就会覆盖掉原来的读者编号
if (cFlag == 'n')
{
return;
}
else if (cFlag == 'y')
{
for (i = iReaderId; i < iReaderRecord - 1; i++)
{
astReader[i] = astReader[i + 1];//数组依次前移
}
iReaderRecord--;
}
pfReader = fopen("reader.txt", "wb");
if (pfReader != NULL)
{
for (i = 0; i < iReaderRecord; i++)
{
if (fwrite(&astReader[i], LEN_READER, 1, pfReader) != 1)
{
printf("无法保存该信息!\n");
return;
}
}
fclose(pfReader);
printf("%d号读者信息已删除!\n", index);
}
}
void ShowModifyReaderMenu()//显示修改的选项
{
printf("\n\n");
printf("——————————————————————————\n");
printf("********************1.编号**************************\n");
printf("********************2.姓名**************************\n");
printf("********************3.性别**************************\n");
printf("********************4.最大可阅读数量****************\n");
printf("——————————————————————————\n");
printf("请输入所要修改的信息,请选择(1-4):");
}
//保存修改后读者信息
void SaveReaderFile(int iReaderld)
{
FILE* pfReader;
pfReader = fopen("reader.txt", "rb+");
if (pfReader != NULL)
{
fseek(pfReader, LEN_READER * iReaderld, SEEK_SET);
if (fwrite(&astReader[iReaderld], LEN_READER, 1, pfReader) != 1)
{
printf("无法保存该信息!\n");
}
}
fclose(pfReader);
}
void ModifyReader()//修改读者信息
{
int iReaderld, iReaderRecord, iBorrow, iItem, iNum, iMax, iFlagExist, i;
system(" cls");
iReaderld = SearchReader();
if (iReaderld == -1)
{
return;
}
//找到该序号的读者,可以进行修改
iReaderRecord = ReadReaderFile("rb");
ShowModifyReaderMenu();//显示修改的选项
scanf("%d", &iItem);
getchar();
switch (iItem)
{
case 1:
printf("请输入读者编号:");
do
{
iFlagExist = 0;
scanf("%d", &iNum);
getchar();
for (i = 0; i < iReaderRecord; i++)
{
if (iNum == astReader[i].iNum && i != iReaderld)
{
iFlagExist = 1;
printf("错误,该读者编号已经存在,请重新输入:");
break;
}
}
} while (iFlagExist == 1);
astReader[iReaderld].iNum = iNum;
break;
case 2:
printf("请输入读者姓名:");
scanf("%s", astReader[iReaderld].acName);
getchar();
break;
case 3:
printf("请输入读者性别:男/女:");
while (scanf("%s", astReader[iReaderld].acSex) > 0)
{
getchar();
if (strcmp(astReader[iReaderld].acSex, "男") == 0 || strcmp(astReader[iReaderld].acSex, "女") == 0)
{
break;
}
printf("错误,只能输入“男”或者“女”,请重新输入:\n");
}
break;
case 4:
//iBorrow:已经借阅的数量
iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
printf("请输入读者最大可借阅的数量(范围为5-10):\n");
while (scanf("%d", &iMax) == 1)
{
getchar();
if (iMax >= 5 && iMax <= 10)
{
if (iBorrow > iMax)
{
printf("先还书!\n");
return;
}
else
{
astReader[iReaderld].iMax = iMax;
astReader[iReaderld].iAmount = iMax - iBorrow;
for (i = iBorrow; i < iMax; i++)
{
astReader[iReaderld].Bookld[i] = 0;
}
break;
}
}
printf("错误,读者最大可借阅的书的范围为5-10,请重新输入:\n");
}
break;
}
SaveReaderFile(iReaderld);
printf("该读者信息已经修改成功!\n");
}
void ManageReader()//读者管理模块
{
int rselect; //选择
ShowReaderMenu();//显示读者管理的子菜单
scanf("%d", &rselect);
getchar();
while (rselect)
{
switch (rselect)
{
case 1:
ShowReader();//显示读者信息
break;
case 2:
AddReader();//新增读者信息
break;
case 3:
SearchReader();//查找读者信息
break;
case 4:
DeleteReader();//删除读者信息
break;
case 5:
ModifyReader();//修改读者信息
break;
defalut:
printf("请输入正确的选项!");
}
printf("请按任意键返回子菜单*_*");
_getch();//从控件中获取字符而无需回响
ShowReaderMenu();//显示读者管理子菜单
scanf("%d", &rselect);
getchar();
}
}
借书还书的登记板块实现:
void showBorrowReturnMenu()//借还书子菜单
{
system("cls");
printf("\n\n");
printf("—————————————————————————————\n");
printf("|********************欢迎进入图书馆**********************|\n");
printf("|********************图书馆管理系统**********************|\n");
printf("|*********************借还书子菜单***********************|\n");
printf("|*********************1.借书登记*************************|\n");
printf("|*********************2.还书登记*************************|\n");
printf("|*********************0.返回主菜单***********************|\n");
printf("—————————————————————————————");
printf("\n");
printf("请选择(0-2)");
}
void BorrowBook()//借书
{
//读者是否有资格借书
system("cls");
int iBookld, iReaderld, iBorrow, i;
//输入要借书的读者编号判断编号是否存在,若存在,显示读者已经借阅的图书信息
iReaderld = SearchReader();
if (iReaderld==-1)
{
return;
}
iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
if (iBorrow == 0)
{
printf("该读者目前没有借阅任何书!");
}
else
{
printf("该读者当前所借图书为:");
for (i = 0; i < iBorrow; i++)
{
printf("%d ", astReader[iReaderld].Bookld[i]);
}
}
if (astReader[iReaderld].iAmount == 0)
{
printf("读者可以借书数量为0,不能继续借书!\n");
}
//书籍是否可以被借阅(书籍是否存在,库存是否还有,借书后读者最大可借阅书籍减少)
printf("\n请按任意键输入要借阅的图书信息*_*\n");
_getch();
iBookld = SearchBook();
if (iBookld == -1)
{
return;
}
if (astBook[iBookld].iAmount == 0)
{
printf("该图书库存为0,图书不可借阅!\n");
return;
}
//借书操作
astReader[iReaderld].Bookld[iBorrow] = astBook[iBookld].iNum;
//图书的库存减一
astBook[iBookld].iAmount--;
//当前可借阅的书的数量减一
astReader[iReaderld].iAmount--;
SaveBookFile(iBookld);
SaveReaderFile(iReaderld);
printf("借书成功!\n");
}
void ReturnBook()//还书
{
system("cls");
int iBookld, iReaderld, iBorrow, i, j;
//读者
iReaderld = SearchReader();
if (iReaderld == -1)
{
return;
}
iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
if (iBorrow == 0)
{
printf("该读者未借阅任何书,无需归还\n");
return;
}
else
{
printf("\n该读者当前借阅的图书为:");
for (i = 0; i < iBorrow; i++)
{
printf("%d ", astReader[iReaderld].Bookld[i]);
}
}
printf("\n按任意键输入要归还的图书信息\n");
_getch();
//图书在不在
iBookld = SearchBook();
if (iBookld == -1)
return;
//借书列表里有没有这本书
for (i = 0; i < iBorrow; i++)
{
if (astReader[iReaderld].Bookld[i] == astBook[iBookld].iNum)
{
//还书
for (j = i; j < iBorrow-1; j++)
{
astReader[iReaderld].Bookld[j] = astReader[iReaderld].Bookld[j + 1];
}
astReader[iReaderld].Bookld[iBorrow - 1] = 0;
//图书库存加一
astBook[iBookld].iAmount++;
//读者的可借书的数量+1
astReader[iReaderld].iAmount++;
break;
}
}
if (i == iBorrow)
{
printf("该读者未借阅这本书,无需归还");
return;
}
SaveBookFile(iBookld);
SaveReaderFile(iReaderld);
printf("还书成功!\n");
}
void ManageBorrowReturn()//借还书管理模块
{
showBorrowReturnMenu();//借还书的子菜单
int iltem;
scanf("%d", &iltem);
getchar();
while (iltem)
{
switch (iltem)
{
case 1:
BorrowBook();//借书
break;
case 2:
ReturnBook();//还书
break;
default:
printf("请输入正确的选项!\n");
}
printf("请按任意键返回子菜单*_*");
_getch();//从控件中获取字符而无需回响
showBorrowReturnMenu();//显示借还书管理子菜单
scanf("%d", &iltem);
getchar();
}
}
操作演示:
?完整代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#define BOOK_NUM 200
#define READER_NUM 200
#define BOOK_DATA astBook[i].iNum,astBook[i].acName,astBook[i].acAuthor,astBook[i].acPress,astBook[i].iAmount
#define READER_DATA astReader[i].iNum,astReader[i].acName,astReader[i].acSex,astReader[i].iMax,astReader[i].iAmount
#define LEN_BOOK sizeof(struct Book) //结构体大小
#define LEN_READER sizeof(struct Reader)
struct Book
{
int iNum; //图书编号
char acName[15];//图书名称
char acAuthor[15];//图书作者
char acPress[15]; //图书出版社
int iAmount; //图书库存
};
struct Reader
{
int iNum;//读者编号
char acName[15];//读者姓名
char acSex[4];//读者性别
int iMax;//读者最大可阅读数量
int iAmount;//读者当前可借阅的数量
int Bookld[10];//读者已经借阅的图书
};
//定义两个全局结构体数组来记录所有图书信息和所有读者信息
struct Book astBook[BOOK_NUM];
struct Reader astReader[READER_NUM];
//显示主菜单
void Meau()
{
//清屏函数
system("cls");
printf("\n\n");
printf("——————————————————————————\n");
printf("********************欢迎进入图书馆******************\n");
printf("********************图书馆管理系统******************\n");
printf("************************主菜单**********************\n");
printf("*********************1.图书管理*********************\n");
printf("*********************2.读者管理*********************\n");
printf("*********************3.登记借还书*******************\n");
printf("*********************0.退出系统*********************\n");
printf("——————————————————————————");
printf("\n");
printf("请选择(0-3)");
}
void ShowBookMenu()//显示书籍管理子菜单
{
//清屏函数
system("cls");
printf("\n\n");
printf("—————————————————————————————\n");
printf("|********************欢迎进入图书馆**********************|\n");
printf("|********************图书馆管理系统**********************|\n");
printf("|**********************图书子菜单************************|\n");
printf("|********************1.显示图书信息**********************|\n");
printf("|********************2.新增图书信息**********************|\n");
printf("|********************3.查找图书信息**********************|\n");
printf("|********************4.删除图书信息**********************|\n");
printf("|********************5.修改图书信息**********************|\n");
printf("|********************0.返回主菜单************************|\n");
printf("—————————————————————————————");
printf("\n");
printf("请选择(0-5)");
}
int ReadBookFile(const char* pcMode)//读取图书文件
{
int iBookRecord = 0;
FILE* pfBook; //文件指针
pfBook = fopen("book.txt", pcMode);
if (pfBook == NULL)
{
return -1;
}
while (!feof(pfBook))
{
if(fread(&astBook[iBookRecord],LEN_BOOK,1,pfBook))
{
iBookRecord++;
}
}
fclose(pfBook);
return iBookRecord;
}
void ShowBook()//显示图书信息
{
int i, iBookRecord;//记录条数
system("cls");
iBookRecord = ReadBookFile("rb");//从文件中只读
if (iBookRecord == -1)
{
printf("改文件打开失败,请先新增图书信息!\n");
}
if (iBookRecord == 0)
{
printf("文件中没有图书信息!\n");
}
else
{
printf("\n\n");
printf("—————————————————————————————————\n");
printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "书名", "作者", "出版社", "库存");
for (i = 0; i < iBookRecord; i++)
{
printf("%-10d%-16s%-16s%-18s%-6d\n",BOOK_DATA);
printf("—————————————————————————————————\n");
}
printf("\n");
}
}
void AddBook()//新增图书信息
{
FILE* pfBook;
int iBookRecord, iFlagExist, i;
char cFlag;
system("cls");
iBookRecord = ReadBookFile("ab+");//ab+追加方式打开或者新建二进制文件
if (iBookRecord == -1)
{
printf("文件打开失败!\n");
return;
}
else if (iBookRecord == 0)
{
printf("没有图书记录!\n");
}
else
{
ShowBook();//显示图书信息
}
//循环录入图书信息
printf("请选择是否输入信息(y/n)");
cFlag = getchar();
getchar();//读取回车
if (cFlag == 'n')
{
return;
}
pfBook = fopen("book.txt", "ab+");
if (pfBook == NULL)
{
printf("文件打开失败!\n");
return;
}
while (cFlag == 'y')
{
//录入数据
if (iBookRecord >= BOOK_NUM)
{
printf("记录已满!");
fclose(pfBook);
return;
}
//图书编号不能重复
printf("请输入图书编号:");
do
{
iFlagExist = 0;//标志
scanf("%d", &astBook[iBookRecord].iNum);
getchar();
for (i = 0; i < iBookRecord; i++)
{
if (astBook[i].iNum == astBook[iBookRecord].iNum)
{
iFlagExist = 1;
printf("该图书编号已经存在,请重新输入:");
break;
}
}
} while (iFlagExist == 1);
//图书名称
printf("请输入图书名称:");
scanf("%s", astBook[iBookRecord].acName);
getchar();
//作者
printf("请输入图书作者:");
scanf("%s", astBook[iBookRecord].acAuthor);
getchar();
//出版社
printf("请输入图书出版社:");
scanf("%s", astBook[iBookRecord].acPress);
getchar();
//库存
printf("请输入图书库存:");
scanf("%d", &astBook[iBookRecord].iAmount);
getchar();
//将新增的图书信息写入到文件中
if(fwrite(&astBook[iBookRecord],LEN_BOOK,1,pfBook)!=1)
{
printf("无法保存信息!\n");
return;
}
else
{
printf("%d号图书信息已经保存!\n", astBook[iBookRecord].iNum);
iBookRecord++;
}
printf("是否继续输入信息(y/n)");
cFlag = getchar();
getchar();
}
fclose(pfBook);
printf("添加图书信息执行完毕!\n");
}
int SearchBook()//查找图书信息
{
int iBookNum, iBookRecord, iBookld, i;//要查找的编号,记录条数,记录编号,循环
system("cls");
iBookRecord = ReadBookFile("rb");
if (iBookRecord == -1)
{
printf("文件打开失败!\n");
printf("按任意键返回子菜单!*-*");
_getch();
return -2;//文件打开失败,返回-2
}
else if (iBookRecord == 0)
{
printf("没有图书记录!\n");
printf("按任意键返回子菜单!*-*");
_getch();//接受键盘而不回响
return -3;//没有记录返回-3
}
//进入查找程序
printf("请输入图书编号:");
scanf("%d", &iBookNum);
getchar();
for (i = 0; i < iBookRecord; i++)
{
if (iBookNum == astBook[i].iNum)
{
iBookld = i;//找到记录,返回记录编号
printf("%d号图书信息如下:\n", iBookNum);
printf("—————————————————————————————————\n");
printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "书名", "作者", "出版社", "库存");
printf("%-10d%-16s%-16s%-18s%-6d\n", BOOK_DATA);
printf("—————————————————————————————————\n");
break;
}
}
if (i == iBookRecord)
{
printf("未找到%d号图书信息!\n", iBookNum);
iBookld = -1; //找不到返回-1
}
return iBookld;
}
void DeleteBook()//删除图书信息
{
FILE* pfBook;
int iBookld, iBookRecord, i;
char cFlag;
system("cls");
iBookld = SearchBook();
if (iBookld == -1)
{
return;
}
if (iBookld == -2)
{
printf("文件打开失败!\n");
return;
}
if (iBookld == -3)
{
printf("未查到该记录!\n");
return;
}
iBookRecord = ReadBookFile("rb");
printf("已经找到该图书信息,是否删除(y/n)");
cFlag = getchar();
getchar();
//删除之前保存删除之前的图书编号,输出之后编号信息会被覆盖
int index = astBook[iBookld].iNum;
if (cFlag == 'n')
{
return;
}
else if (cFlag == 'y')
{
for (i = iBookld; i < iBookRecord - 1; i++)
{
astBook[i] = astBook[i + 1];//数组依次前移
}
iBookRecord--;
}
pfBook = fopen("book.txt", "wb");
if (pfBook != NULL)
{
for (i = 0; i < iBookRecord; i++)
{
if (fwrite(&astBook[i], LEN_BOOK, 1, pfBook) != 1)
{
printf("无法保存该信息!\n");
return;
}
}
fclose(pfBook);
printf("%d号图书信息已经删除!\n", index);
}
}
//显示图书修改选项的子菜单
void ShowModifyBookMenu()
{
printf("\n\n");
printf("——————————————————————————\n");
printf("********************1.编号**************************\n");
printf("********************2.书名**************************\n");
printf("********************3.作者**************************\n");
printf("********************4.出版社************************\n");
printf("********************5.图书库存量********************\n");
printf("——————————————————————————\n");
printf("请输入所要修改的信息,请选择(1-5):");
}
//保存修改后图书信息
void SaveBookFile(int iBookld)
{
FILE* pfBook;
pfBook = fopen("book.txt", "rb+");
if (pfBook != NULL)
{
fseek(pfBook, LEN_BOOK * iBookld, SEEK_SET);
if (fwrite(&astBook[iBookld], LEN_BOOK, 1, pfBook) != 1)
{
printf("无法保存该信息!\n");
}
}
fclose(pfBook);
}
void ModifyBook()//修改图书信息
{
int iBookld, iBookRecord, iFlagExist, iltem, iNum, i;//查找到的书籍id,记录条数,标记是否重复,输入选择,修改的编号
system("cls");
iBookld = SearchBook();
if (iBookld== -1)
{
return;
}
if (iBookld == -2)
{
printf("文件打开失败!\n");
return;
}
if (iBookld == -3)
{
printf("未查到该记录!\n");
return;
}
//找到该序号的图书,可以进行修改操作
iBookRecord = ReadBookFile("rb");
//显示修改选项的子菜单
ShowModifyBookMenu();
scanf("%d", &iltem);
getchar();
switch (iltem)
{
case 1:
printf("请输入图书编号:");
do
{
iFlagExist = 0;
scanf("%d", &iNum);
getchar();
for (i = 0; i < iBookRecord; i++)
{
if (iNum == astBook[i].iNum && i != iBookld)
{
iFlagExist = 1;
printf("错误,该图书编号已存在,请重新输入:");
break;
}
}
} while (iFlagExist == 1);
astBook[iBookld].iNum = iNum;
break;
case 2:
printf("请输入图书名称:");
scanf("%s", astBook[iBookld].acName);
getchar();
break;
case 3:
printf("请输入图书作者:");
scanf("%s", astBook[iBookld].acAuthor);
getchar();
break;
case 4:
printf("请输入图书出版社:");
scanf("%s", astBook[iBookld].acPress);
getchar();
break;
case 5:
printf("请输入图书库存量:");
scanf("%d", &astBook[iBookld].iAmount);
getchar();
break;
}
SaveBookFile(iBookld);
printf("图书信息修改成功!\n");
}
void ManageBook()//书籍管理
{
int iltem;
ShowBookMenu();//显示书籍管理子菜单
scanf("%d", &iltem);
getchar();
while (iltem)
{
switch (iltem)
{
case 1:
ShowBook();//显示图书信息
break;
case 2:
AddBook();//新增图书信息
break;
case 3:
SearchBook();//查找图书信息
break;
case 4:
DeleteBook();//删除图书信息
break;
case 5:
ModifyBook();//修改图书信息
break;
default:
printf("请输入正确的选项!");
}
printf("请按任意键返回子菜单*_*");
_getch();//从控件中获取字符而无需回响
ShowBookMenu();//显示书籍管理子菜单
scanf("%d", &iltem);
getchar();
}
}
void ShowReaderMenu()//显示读者管理子菜单
{
//清屏函数
system("cls");
printf("\n\n");
printf("—————————————————————————————\n");
printf("|********************欢迎进入图书馆**********************|\n");
printf("|********************图书馆管理系统**********************|\n");
printf("|********************* 读者子菜单************************|\n");
printf("|********************1.显示读者信息**********************|\n");
printf("|********************2.新增读者信息**********************|\n");
printf("|********************3.查找读者信息**********************|\n");
printf("|********************4.删除读者信息**********************|\n");
printf("|********************5.修改读者信息**********************|\n");
printf("|********************0.返回主菜单************************|\n");
printf("—————————————————————————————");
printf("\n");
printf("请选择(0-5)");
}
int ReadReaderFile(const char* pcMode)//读取读者信息文件
{
int iReaderRecord = 0;
FILE* pfReader; //文件指针
pfReader = fopen("reader.txt", pcMode);
if (pfReader == NULL)
{
return -1;
}
while (!feof(pfReader))
{
if (fread(&astReader[iReaderRecord], LEN_READER, 1, pfReader))
{
iReaderRecord++;
}
}
fclose(pfReader);
return iReaderRecord;
}
void ShowReader()//显示读者信息
{
int i, iReaderRecord;//记录条数
system("cls");
iReaderRecord = ReadReaderFile("rb");//从文件中只读
if (iReaderRecord == -1)
{
printf("改文件打开失败,请先新增读者信息!\n");
}
if (iReaderRecord == 0)
{
printf("文件中没读者信息!\n");
}
else
{
printf("\n\n");
printf("—————————————————————————————————————\n");
printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "姓名", "性别", "最大可借书数量", "当前可借书数量");
for (i = 0; i < iReaderRecord; i++)
{
printf("%-10d%-16s%-16s%-18d%-6d\n", READER_DATA);
printf("—————————————————————————————————————\n");
}
printf("\n");
}
}
void AddReader()//新增读者信息
{
FILE* pfReader;
int iReaderRecord, iFlagExist, i;
char cFlag;
system("cls");
iReaderRecord = ReadReaderFile("ab+");//ab+追加方式打开或者新建二进制文件
if (iReaderRecord == -1)
{
printf("文件打开失败!\n");
return;
}
else if (iReaderRecord == 0)
{
printf("没有读者记录!\n");
}
else
{
ShowReader();//显示读者信息
}
//循环录入读者信息
printf("请选择是否输入信息(y/n)");
cFlag = getchar();
getchar();//读取回车
if (cFlag == 'n')
{
return;
}
pfReader = fopen("reader.txt", "ab+");
if (pfReader == NULL)
{
printf("文件打开失败!\n");
return;
}
while (cFlag == 'y')
{
//录入数据
if (iReaderRecord >= READER_NUM)
{
printf("记录已满!");
fclose(pfReader);
return;
}
//读者编号不能重复
printf("请输入读者编号:");
do
{
iFlagExist = 0;//标志
scanf("%d", &astReader[iReaderRecord].iNum);
getchar();
for (i = 0; i < iReaderRecord; i++)
{
if (astReader[i].iNum == astReader[iReaderRecord].iNum)
{
iFlagExist = 1;
printf("该读者编号已经存在,请重新输入:");
break;
}
}
} while (iFlagExist == 1);
//读者姓名
printf("请输入读者姓名:");
scanf("%s", astReader[iReaderRecord].acName);
getchar();
//读者性别
printf("请输入读者性别:男or女:");
scanf("%s", astReader[iReaderRecord].acSex);
getchar();
int sex = 1;//标志
while (sex)
{
if (strcmp(astReader[iReaderRecord].acSex, "男") == 0 || strcmp(astReader[iReaderRecord].acSex, "女") == 0)
{
sex = 0;
break;
}
else
{
sex = 1;
printf("读者性别输入错误,请重新输入:");
scanf("%s", astReader[iReaderRecord].acSex);
}
}
//读者最大可阅读数量
printf("请输入读者最大可阅读数量:");//10,范围
scanf("%d", &astReader[iReaderRecord].iMax);
getchar();
//读者当前可借阅的数量
printf("请输入读者当前可借阅的数量:");//新增的读者10,提示,两者必须相等
scanf("%d", &astReader[iReaderRecord].iAmount);
getchar();
//将新增的图书信息写入到文件中
if (fwrite(&astReader[iReaderRecord], LEN_READER, 1, pfReader) != 1)
{
printf("无法保存信息!\n");
return;
}
else
{
printf("%d号读者信息已经保存!\n", astReader[iReaderRecord].iNum);
iReaderRecord++;
}
printf("是否继续输入信息(y/n)");
cFlag = getchar();
getchar();
}
fclose(pfReader);
printf("添加读者信息执行完毕!\n");
}
int SearchReader()//查找读者信息
{
int iReaderNum, iReaderRecord, iReaderld, i;//要查找的编号,记录条数,记录编号,循环
system("cls");
iReaderRecord = ReadReaderFile("rb");
if (iReaderRecord == -1)
{
printf("文件打开失败!\n");
printf("按任意键返回子菜单!*-*");
_getch();
return -2;//文件打开失败,返回-2
}
else if (iReaderRecord == 0)
{
printf("没有读者记录!\n");
printf("按任意键返回子菜单!*-*");
_getch();//接受键盘而不回响
return -3;//没有记录返回-3
}
//进入查找程序
printf("请输入读者编号:");
scanf("%d", &iReaderNum);
getchar();
for (i = 0; i < iReaderRecord; i++)
{
if (iReaderNum == astReader[i].iNum)
{
iReaderld = i;//找到记录,返回记录编号
printf("%d号读者信息如下:\n", iReaderNum);
printf("—————————————————————————————————————\n");
printf("%-10s%-16s%-16s%-18s%-6s\n", "编号", "姓名", "性别", "最大可借书数量", "当前可借书数量");
printf("%-10d%-16s%-16s%-18d%-6d\n", READER_DATA);
printf("—————————————————————————————————————\n");
break;
}
}
if (i == iReaderRecord)
{
printf("未找到%d号读者信息!\n", iReaderNum);
iReaderld = -1; //找不到返回-1
}
return iReaderld;
}
void DeleteReader()//删除读者信息
{
FILE* pfReader;//文件指针
int iReaderId, iReaderRecord, i;
char cFlag;
system("cls");
iReaderId = SearchReader();
if (iReaderId == -1)
{
return;
}
iReaderRecord = ReadReaderFile("rb");
printf("已经找到该读者,是否删除?(y/n)");
cFlag = getchar();
getchar();
int index = astReader[iReaderId].iNum;//index保存删除之前的读者编号,因为删除
//之后新的读者编号就会覆盖掉原来的读者编号
if (cFlag == 'n')
{
return;
}
else if (cFlag == 'y')
{
for (i = iReaderId; i < iReaderRecord - 1; i++)
{
astReader[i] = astReader[i + 1];//数组依次前移
}
iReaderRecord--;
}
pfReader = fopen("reader.txt", "wb");
if (pfReader != NULL)
{
for (i = 0; i < iReaderRecord; i++)
{
if (fwrite(&astReader[i], LEN_READER, 1, pfReader) != 1)
{
printf("无法保存该信息!\n");
return;
}
}
fclose(pfReader);
printf("%d号读者信息已删除!\n", index);
}
}
void ShowModifyReaderMenu()//显示修改的选项
{
printf("\n\n");
printf("——————————————————————————\n");
printf("********************1.编号**************************\n");
printf("********************2.姓名**************************\n");
printf("********************3.性别**************************\n");
printf("********************4.最大可阅读数量****************\n");
printf("——————————————————————————\n");
printf("请输入所要修改的信息,请选择(1-4):");
}
//保存修改后读者信息
void SaveReaderFile(int iReaderld)
{
FILE* pfReader;
pfReader = fopen("reader.txt", "rb+");
if (pfReader != NULL)
{
fseek(pfReader, LEN_READER * iReaderld, SEEK_SET);
if (fwrite(&astReader[iReaderld], LEN_READER, 1, pfReader) != 1)
{
printf("无法保存该信息!\n");
}
}
fclose(pfReader);
}
void ModifyReader()//修改读者信息
{
int iReaderld, iReaderRecord, iBorrow, iItem, iNum, iMax, iFlagExist, i;
system(" cls");
iReaderld = SearchReader();
if (iReaderld == -1)
{
return;
}
//找到该序号的读者,可以进行修改
iReaderRecord = ReadReaderFile("rb");
ShowModifyReaderMenu();//显示修改的选项
scanf("%d", &iItem);
getchar();
switch (iItem)
{
case 1:
printf("请输入读者编号:");
do
{
iFlagExist = 0;
scanf("%d", &iNum);
getchar();
for (i = 0; i < iReaderRecord; i++)
{
if (iNum == astReader[i].iNum && i != iReaderld)
{
iFlagExist = 1;
printf("错误,该读者编号已经存在,请重新输入:");
break;
}
}
} while (iFlagExist == 1);
astReader[iReaderld].iNum = iNum;
break;
case 2:
printf("请输入读者姓名:");
scanf("%s", astReader[iReaderld].acName);
getchar();
break;
case 3:
printf("请输入读者性别:男/女:");
while (scanf("%s", astReader[iReaderld].acSex) > 0)
{
getchar();
if (strcmp(astReader[iReaderld].acSex, "男") == 0 || strcmp(astReader[iReaderld].acSex, "女") == 0)
{
break;
}
printf("错误,只能输入“男”或者“女”,请重新输入:\n");
}
break;
case 4:
//iBorrow:已经借阅的数量
iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
printf("请输入读者最大可借阅的数量(范围为5-10):\n");
while (scanf("%d", &iMax) == 1)
{
getchar();
if (iMax >= 5 && iMax <= 10)
{
if (iBorrow > iMax)
{
printf("先还书!\n");
return;
}
else
{
astReader[iReaderld].iMax = iMax;
astReader[iReaderld].iAmount = iMax - iBorrow;
for (i = iBorrow; i < iMax; i++)
{
astReader[iReaderld].Bookld[i] = 0;
}
break;
}
}
printf("错误,读者最大可借阅的书的范围为5-10,请重新输入:\n");
}
break;
}
SaveReaderFile(iReaderld);
printf("该读者信息已经修改成功!\n");
}
void ManageReader()//读者管理模块
{
int rselect; //选择
ShowReaderMenu();//显示读者管理的子菜单
scanf("%d", &rselect);
getchar();
while (rselect)
{
switch (rselect)
{
case 1:
ShowReader();//显示读者信息
break;
case 2:
AddReader();//新增读者信息
break;
case 3:
SearchReader();//查找读者信息
break;
case 4:
DeleteReader();//删除读者信息
break;
case 5:
ModifyReader();//修改读者信息
break;
defalut:
printf("请输入正确的选项!");
}
printf("请按任意键返回子菜单*_*");
_getch();//从控件中获取字符而无需回响
ShowReaderMenu();//显示读者管理子菜单
scanf("%d", &rselect);
getchar();
}
}
void showBorrowReturnMenu()//借还书子菜单
{
system("cls");
printf("\n\n");
printf("—————————————————————————————\n");
printf("|********************欢迎进入图书馆**********************|\n");
printf("|********************图书馆管理系统**********************|\n");
printf("|*********************借还书子菜单***********************|\n");
printf("|*********************1.借书登记*************************|\n");
printf("|*********************2.还书登记*************************|\n");
printf("|*********************0.返回主菜单***********************|\n");
printf("—————————————————————————————");
printf("\n");
printf("请选择(0-2)");
}
void BorrowBook()//借书
{
//读者是否有资格借书
system("cls");
int iBookld, iReaderld, iBorrow, i;
//输入要借书的读者编号判断编号是否存在,若存在,显示读者已经借阅的图书信息
iReaderld = SearchReader();
if (iReaderld==-1)
{
return;
}
iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
if (iBorrow == 0)
{
printf("该读者目前没有借阅任何书!");
}
else
{
printf("该读者当前所借图书为:");
for (i = 0; i < iBorrow; i++)
{
printf("%d ", astReader[iReaderld].Bookld[i]);
}
}
if (astReader[iReaderld].iAmount == 0)
{
printf("读者可以借书数量为0,不能继续借书!\n");
}
//书籍是否可以被借阅(书籍是否存在,库存是否还有,借书后读者最大可借阅书籍减少)
printf("\n请按任意键输入要借阅的图书信息*_*\n");
_getch();
iBookld = SearchBook();
if (iBookld == -1)
{
return;
}
if (astBook[iBookld].iAmount == 0)
{
printf("该图书库存为0,图书不可借阅!\n");
return;
}
//借书操作
astReader[iReaderld].Bookld[iBorrow] = astBook[iBookld].iNum;
//图书的库存减一
astBook[iBookld].iAmount--;
//当前可借阅的书的数量减一
astReader[iReaderld].iAmount--;
SaveBookFile(iBookld);
SaveReaderFile(iReaderld);
printf("借书成功!\n");
}
void ReturnBook()//还书
{
system("cls");
int iBookld, iReaderld, iBorrow, i, j;
//读者
iReaderld = SearchReader();
if (iReaderld == -1)
{
return;
}
iBorrow = astReader[iReaderld].iMax - astReader[iReaderld].iAmount;
if (iBorrow == 0)
{
printf("该读者未借阅任何书,无需归还\n");
return;
}
else
{
printf("\n该读者当前借阅的图书为:");
for (i = 0; i < iBorrow; i++)
{
printf("%d ", astReader[iReaderld].Bookld[i]);
}
}
printf("\n按任意键输入要归还的图书信息\n");
_getch();
//图书在不在
iBookld = SearchBook();
if (iBookld == -1)
return;
//借书列表里有没有这本书
for (i = 0; i < iBorrow; i++)
{
if (astReader[iReaderld].Bookld[i] == astBook[iBookld].iNum)
{
//还书
for (j = i; j < iBorrow-1; j++)
{
astReader[iReaderld].Bookld[j] = astReader[iReaderld].Bookld[j + 1];
}
astReader[iReaderld].Bookld[iBorrow - 1] = 0;
//图书库存加一
astBook[iBookld].iAmount++;
//读者的可借书的数量+1
astReader[iReaderld].iAmount++;
break;
}
}
if (i == iBorrow)
{
printf("该读者未借阅这本书,无需归还");
return;
}
SaveBookFile(iBookld);
SaveReaderFile(iReaderld);
printf("还书成功!\n");
}
void ManageBorrowReturn()//借还书管理模块
{
showBorrowReturnMenu();//借还书的子菜单
int iltem;
scanf("%d", &iltem);
getchar();
while (iltem)
{
switch (iltem)
{
case 1:
BorrowBook();//借书
break;
case 2:
ReturnBook();//还书
break;
default:
printf("请输入正确的选项!\n");
}
printf("请按任意键返回子菜单*_*");
_getch();//从控件中获取字符而无需回响
showBorrowReturnMenu();//显示借还书管理子菜单
scanf("%d", &iltem);
getchar();
}
}
int main()
{
//显示主函数界面
Meau();
int num;
scanf("%d", &num);
while (num)
{
switch (num)
{
case 1:
ManageBook();//图书管理模块
break;
case 2:
ManageReader();//读者管理模块
break;
case 3:
ManageBorrowReturn();//借还书管理模块
break;
default:
printf("请输入正确选项!\n程序将于3秒后跳转主菜单");
Sleep(3000);
}
Meau();
scanf("%d", &num);
getchar();
}
return 0;
}
|