1. 设计思路
图书:(增删改查) 显示
读者:(增删改查) 显示 借书 还书 主菜单 子菜单
系统如下图
如上图,实际上只需要执行三个模块:图书管理模块,读者管理模块,借书还书登记模块
2. 实现图书管理模块
#define _CRT_SECURE_NO_WARNINGS //scanf宏定义
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#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)
//两个结构体封装图书和读者的基本信息
//图书
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 ShowMainMeun()
{
//清屏函数
system("cls");
printf("\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");
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
if(pfBook==NULL)
{
return -1;
}
while (!feof(pfBook))//feof函数指的是,一直读取直到结尾
{
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("\t|*********************************************|\n");
printf("\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); //BOOK_DATA宏定义
}
printf("\n\n");
printf("\t|***************************************************|\n");
printf("\n\n");
}
}
//新增图书信息
void AddBook()
{
FILE* pfBook;
int iBookRecord, iFlagExist,i; //iFlagExist编号不能重复
char cFlag;
system("cls");
iBookRecord = ReadBookFile("ab+");//ab+追加方式打开文件或者新建二进制文件
if (iBookRecord == -1)
{
printf("文件打开失败\n");
return;
}
else if (iBookRecord == 0)
{
printf("没有图书记录\n");
}
else
{
ShowBook();//如果图书记录不为0,则显示所有图书
}
//循环录入图书信息
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)//只能录入200个数据
{
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;
//i其中BookNum表示编号 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 < iBookNum; i++)
{
if (iBookNum == astBook[i].iNum)
{
iBookld = 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);
iBookld = -1;//找不到记录,返回-1;
}
return iBookld;
}
//删除图书信息
void DeleteBook()
{
FILE* pfBook;
int iBookld, iBookRecord, i;
char cFlag;
system("cls");
iBookld = SearchBook();
if (iBookld == -1)
{
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 = 0; 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\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):");
}
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;
system("cls");
iBookld = SearchBook();
if (iBookld == -1)
{
return;
}
if (iBookld == -3)
{
return;
}
//找到该序号的图书,可以进行修改操作
iBookRecord = ReadBookFile("rb");
//显示修改选项的子菜单
ShowModifyBookMenu();
scanf_s("%d", &iltem);
getchar();
switch (iltem)
{
case 1:
printf("请输入图书编号");
do
{
iFlagExist = 0;
scanf_s("%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 MangageBook()
{
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("\t\t请输入正确的数字!\n\t\t");
}
printf("|请按任意键返回子菜单|");
_getch();//从控件中获取字符而无需回显,头文件conio
ShowBookMenu();
scanf("%d", &iltem);
getchar();
}
}
int main()
{
//显示主函数的界面;
ShowMainMeun();
int iltem;
scanf("%d", &iltem);
while (iltem)//只要iltem不是0,就这一直在这个循环中,直到遇到0,突出整个系统
{
switch (iltem)
{
case 1:
MangageBook();//图书管理模块
break;
case 2:
//todo
//MangageReader();//读者管理模块
break;
case 3:
//todo
//BorrowReturnManger();//借还书模块
break;
default:
printf("\t\t请输入正确的数字!\n\t程序将于3秒后跳转到主菜单");
Sleep(3000);
}
ShowMainMeun();
scanf("%d", &iltem);
getchar();
}
return 0;
}
最后运行显示界面类似如下,再进一步实现其中的信息
?
注意:可以自己操作实现第一模块,注意其中的宏定义部分代表的含义,还有每个函数中的子函数注意点,下一篇写第二模块---读者管理模块。
|