// ConsoleApplication4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<stdio.h>
#include<conio.h>
#include<Windows.h>
#include<iostream>
#define BOOK_NUM 200
#define READER_NUM 100
#define BOOK_DATA astBook[i].iNum,astBook[i].acName,astBook[i].acAuthor,astBook[i].acPress,astBook[i].iAmount
#define LEN_BOOK sizeof(struct Book)
#define _CRT_SECURE_NO_WARNINGS
//两个结构体封装图书和读者的基本信息
struct Book
{
int iNum;//图书编号
char acName[15];//图书名称
char acAuthor[15];//图书作者
char acPress[15];//图书出版社
int iAmount;//图书库存量
};
struct Reader
{
int iNum;//读者编号
char acName[15];//读者姓名
char acSex[4];//读者性别
int iMax;//读者最大可借阅数量
int iAmount;//读者当前可借阅数量
int BookId[10];//读者已经借阅的图书列表
};
//定义两个全局结构体数组来记录所有图书信息和所有读者信息
struct Book astBook[BOOK_NUM];
struct Reader astReader[READER_NUM];
void ShowMainMeun()
{
//清屏函数
system("cls");
printf("\n\n\n\n\n\n");
printf("\t******************************欢迎进入****************************\n");
printf("\t***************************图书馆管理系统*************************\n");
printf("\t******************************主菜单******************************\n");
printf("\t******************************1.图书管理**************************\n");
printf("\t******************************2.读者管理**************************\n");
printf("\t******************************3.借还书登记************************\n");
printf("\t******************************0.退出系统************************\n");
printf("\n");
printf("\t\t请选择(0-3):");
}
//显示书籍管理的子菜单
void ShowBookMenu()
{
system("cls");
printf("\n\n\n\n\n\n");
printf("\t***************************欢迎进入****************************\n");
printf("\t***************************图书馆管理系统*************************\n");
printf("\t******************************子菜单******************************\n");
printf("\t******************************1.显示图书信息**************************\n");
printf("\t******************************2.新增图书信息**************************\n");
printf("\t******************************3.查询图书信息************************\n");
printf("\t******************************4.删除图书信息************************\n");
printf("\t******************************5.修改图书信息************************\n");
printf("\t********************************0.返回主菜单************************\n");
printf("\n");
printf("\t\t请选择(0-5):");
}
int ReadBookFile(const char* pcMode)
{
int iBookRecord = 0;
FILE* pfBook;//定义的文件指针
//pfBook = fopen("book.txt", pcMode);//以只读的方式打开
fopen_s(&pfBook, "book.txt", pcMode);
if (pfBook == NULL)
{
return -1;
}
while (!feof(pfBook))//当没有读到尾时,则循环继续
{
if (fread(&astBook[iBookRecord], LEN_BOOK, 1, pfBook))//从pfBook中一次读取一个,以LEN_BOOK为单位,读在astBook[iBookRecord]中
{
iBookRecord++;
}
fclose(pfBook);
return iBookRecord;
}
}
void ShowBook()
{
int i;//定义的下标
int iBookRecord;//记录条数
system("cls");//清屏
iBookRecord = ReadBookFile("rb");//以只读的方式读取文件中的数据(只显示不修改)
if (iBookRecord ==-1)
{
printf("该文件打开失败,请先新增图书信息!/n");
}
if (iBookRecord == 0)
{
printf("文件中没有图书信息!/n");
}
else
{
printf("\t|********************************************************|\n");
printf("\n\n\n");
printf("\t%-6s%-16s%-10s%-20s%-4s\n", "编号", "书名", "作者", "出版社", "库存量");
for (i = 0; i < iBookRecord; i++)
{
printf("\t%-6d%-16s%-10s%-20s%-4d\n", BOOK_DATA);
}
printf("\n\n\n");
printf("\t|********************************************************|\n");
printf("\n\n\n");
}
}
void AddBook()
{
FILE* pfBook;//文件指针
int iBookRecord;
int iFlagExist=0;//编号是否存在
int i=0;
char cFlag;//是否继续
system("cls");//清屏
iBookRecord = ReadBookFile("ab+");//ab+追加方式打开或者二进制方式
if (iBookRecord == -1)
{
printf("该文件打开失败,请先新增图书信息!/n");
}
else if (iBookRecord == 0)
{
printf("文件中没有图书信息!/n");
}
else
{
ShowBook();//如果图书记录不为0,则显示所有图书
}
//循环录入图书信息
printf("请选择是否输入信息(y/n):");
cFlag = getchar();
if (cFlag == 'n')
{
return;
}
//pfBook = fopen("book.txt", "ab+");
fopen_s(&pfBook,"book.txt", "ab+");
if (pfBook == NULL)
{
printf("文件打开失败\n");
return;
}
while (cFlag == 'y')
{
//录入数据
if(iBookRecord>=BOOK_NUM)
{
printf("记录已满!");
fclose(pfBook);
return;
}
//图书编号不能重复
printf("请输入图书编号:");
do
{
iFlagExist = 0;
scanf_s("%d", &astBook[iBookRecord].iNum);
getchar();
for (i=0;i<iBookRecord;i++)
{
if (astBook[i].iNum == astBook[iBookRecord].iNum)
{
iFlagExist = 1;
printf("该编号重复,请重新输入图书编号:");
break;
}
}
} while (iFlagExist);
printf("请输入图书名称:");
scanf_s("%s", &astBook[iBookRecord].acName);
getchar();
printf("请输入图书作者:");
scanf_s("%s", &astBook[iBookRecord].acAuthor);
getchar();
printf("请输入图书出版社:");
scanf_s("%s", &astBook[iBookRecord].acPress);
getchar();
printf("请输入图书库存量:");
scanf_s("%d", &astBook[iBookRecord].iAmount);
getchar();
//将新增的图书信息写入文件中
if (fwrite(&astBook[iBookRecord],LEN_BOOK,1,pfBook) != 1)//将数据astBook[iBookRecord]写入文件流pfBook
{
printf("无法保存该信息!\n");
return;
}
else
{
printf("%d号信息已经正常保存!\n", astBook[iBookRecord].iNum);
iBookRecord++;
return;
}
printf("继续输入信息吗(y/n):");
cFlag = getchar();
}
fclose(pfBook);
printf("添加图书信息执行完毕!\n");
}
//查询
int SearchBook()
{
int iBookNum;//输入要查找的编号
int iBookRecord;//记录条数
int iBookId;//找到的编号
int i;//循环要用的
system("cls");//清屏
iBookRecord = ReadBookFile("rb");//以只读的方式打开
if (iBookRecord == -1)
{
printf("该文件打开失败!/n");
printf("请按任意键返回子菜单!/n");
_getch();
return -2;
}
else if (iBookRecord == 0)
{
printf("文件中没有图书信息!\n");
printf("请按任意键返回子菜单!\n");
_getch();
return -3;
}
//进入查找程序
printf("请输入图书编号:\n");
scanf_s("%d", &iBookNum);
getchar();
for (i = 0; i < iBookRecord; i++)
{
if (iBookNum == astBook[i].iNum)
{
iBookId = i;//找到记录,返回记录编号
printf("%d号图书信息如下:\n", iBookNum);
printf("\t---------------------------------------------------------------\n");
printf("\t %-6s%-16s%-10s%-20s%-4s\n", "图书编号", "书名", "作者", "出版社", "库存量");
printf("\t %-6d%-16s%-10s%-20s%-4d\n", BOOK_DATA);
printf("\t---------------------------------------------------------------\n");
break;
}
}
if (i == iBookRecord)
{
printf("找不到%d号图书信息!\n", iBookNum);
iBookId = -1;//返回-1
}
}
void DeleteBook()
{
FILE* pfBook;
int iBookNum=0;//输入要查找的编号
int iBookRecord;//记录条数
int iBookId=0;//找到的编号
int i;//循环要用的
char cFlag;//是否要删除的标记
system("cls");//清屏
iBookRecord = SearchBook();//调用查询函数
if (iBookId == -1)
{
return;
}
iBookRecord = ReadBookFile("rb");//以只读的方式打开文件
printf("已经找到该图书。是否删除?(y/n)");
cFlag = getchar();
//删除之前需要保存删除之前的图书编号,因为删除后该图书信息会被覆盖
int index = astBook[iBookId].iNum;
if (cFlag == 'n')
{
return;
}
else if (cFlag == 'y')
{
for (i = iBookId; i < iBookRecord - 1; i++)
{
astBook[i] = astBook[i + 1];
}
iBookRecord--;
}
fopen_s(&pfBook,"book.txt", "wb");//以写的方式打开
if (pfBook != NULL)
{
for (i = 0; i < iBookRecord; i++)
{
if (fwrite(&astBook[i], LEN_BOOK, 1, pfBook) != 1)
{
printf("无法保存该信息!\n");
return;
}
}
fclose(pfBook);
printf("%d号图书信息已经删除!\n",index);
}
}
//显示修改选项的子菜单
void ShowModifyBookMenu()
{
system("cls");
printf("\n\n\n\n\n\n");
printf("\t***************************欢迎进入****************************\n");
printf("\t***************************图书馆管理系统*************************\n");
printf("\t******************************子菜单******************************\n");
printf("\t******************************1.修改编号**************************\n");
printf("\t******************************2.修改书名**************************\n");
printf("\t******************************3.修改作者************************\n");
printf("\t******************************4.修改出版社************************\n");
printf("\t******************************5.修改图书库存量************************\n");
printf("\t 请输入所要修改的信息(输入相应的数字1-5):\n");
}
void SaveBookFile(int iBookId)
{
FILE* pfBook;
fopen_s(&pfBook,"book.txt", "rb+");
if (pfBook != NULL)
{
fseek(pfBook, LEN_BOOK * iBookId, SEEK_SET);//打开文件时,在文件头,应该跳转到需要修改的地方
if (fwrite(&astBook[iBookId], LEN_BOOK, 1, pfBook) != 1)
{
printf("无法保存该信息!\n");
}
}
fclose(pfBook);
}
void Modifyook()
{
int iBookNum = 0;//输入要查找的编号
int iBookRecord;//记录条数
int iBookId = 0;//找到的编号
int iFlagExist;//是否重复
int iltem;//选择
int iNum;
int i;//循环要用的
system("cls");//清屏
iBookRecord = SearchBook();//调用查询函数
if (iBookId == -1)
{
return;
}//找到该编号的图书,则可进行修改
iBookRecord = ReadBookFile("rb");//以只读的方式打开文件
//显示修改选项的子菜单
ShowModifyBookMenu();
scanf_s("%d", &iltem);
getchar();
switch (iltem)
{
case1:
printf("请输入图书编号:");
do{
iFlagExist = 0;
scanf_s("%d", &iNum);
getchar();
for (i = 0; i < iBookRecord; i++)
{
if (iNum == astBook[i].iNum && i != iBookId)
{
iFlagExist = 1;
printf("错误,该图书编号已经存在,请重新输入:");
break;
}
}
} while (iFlagExist == 1);
break;
case2:
printf("请输入图书名称:");
scanf_s("%s", &astBook[iBookId].acName);
getchar();
break;
case3:
printf("请输入图书作者:");
scanf_s("%s", &astBook[iBookId].acAuthor);
getchar();
break;
case4:
printf("请输入图书出版社:");
scanf_s("%s", &astBook[iBookId].acPress);
getchar();
break;
case5:
printf("请输入图书库存量:");
scanf_s("%d", &astBook[iBookId].iAmount);
getchar();
break;
}
SaveBookFile(iBookId);
printf("图书信息修改成功!\n");
}
void MangeBook()//书籍管理
{
int iltem;
ShowBookMenu();//显示书籍管理子菜单
scanf_s("%d", &iltem);
getchar();
while (iltem)
{
switch (iltem)
{
case 1:
ShowBook();//显示图书信息
break;
case 2:
AddBook();//添加图书信息
break;
case 3:
SearchBook();//查找图书信息
break;
case 4:
DeleteBook();//删除图书信息
break;
case 5:
Modifyook();//修改图书信息
break;
default:
printf("\t\t请输入正确的数字!\n\t");
printf("请按任意键返回子菜单");
_getch();//从控件中获取字符不回显
ShowBookMenu();//显示书籍管理子菜单
scanf_s("%d", &iltem);
getchar();
}
}
}
int main()
{
ShowMainMeun();
int iltem;
scanf_s("%d", &iltem);
while (iltem)
{
switch(iltem)
{
case 1:
MangeBook();
break;
case 2:
//MangeReader();
break;
case 3:
//to do
//BorrowReturnManger();
break;
default:
printf("\t\t请输入正确的数字!\n\t程序将于3秒后跳转主菜单");
Sleep(3000);//休眠3秒
ShowMainMeun();
scanf_s("%d", &iltem);
getchar();
}
}
return 0;
}
运行结果:
?
|