- 一、项目背景
- 二、设计目的
- 三、项目功能需求
- 1、图书方面的功能需求
- 2、读者方面的功能需求
- 四、系统的功能结构图
- 五、功能模块介绍
- 1、图书管理模块
- 2、读者管理模块
- 3、借书还书登记模块
- 六、详细设计
- 1、主函数
- 2、图书管理模块
- 3、读者管理模块
- 4、借还书登记模块
- 七、代码
- 八、项目总结
图书馆管理系统,能够实现图书馆的常规业务,包括读者信息维护、图书信息维护和借书还书信息维护。
二、设计目的- 如何设计主菜单和子菜单,以及各级菜单的响应与返回操作
- 如何合理设计不同的结构体对系统中多个实体进行封装
- 如何合理设计多个结构体数组管理不同实体对应的数据
- 如何对复杂的函数过程进行拆分,用多个子函数进行封装
- 进一步熟悉文件读取相关操作
- 新增图书信息
- 删除图书信息
- 修改图书信息
- 查找图书信息
- 显示所有图书信息
- 新增读者信息
- 删除读者信息
- 修改读者信息
- 查找读者信息
- 显示所有的读者信息
- 借书登记
- 还书登记
包括5个子模块,分别是新增图书信息模块、删除图书信息模块、修改图书信息模块、查找图书信息模块和显示图书信息模块
2、读者管理模块包括5个子模块,分别是新增读者信息模块、删除读者信息模块、修改读者信息模块、查找读者信息模块和显示读者信息模块
3、借书还书登记模块包括2个子模块,分别是借书登记模块和还书登记模块
六、详细设计 1、主函数主函数首先调用ShowMainMenu函数绘制主界面,提供三个选项供用户选择,分别可以进入图书管理、读者管理、借还书登记三个子系统。
2、图书管理模块功能设计
- 图书管理子系统实现图书管理功能。
- 输入选项1-5分别对应显示图书信息、增加图书信息、查找图书信息、删除图书信息和修改图书信息五大功能。
- 输入0可以返回主菜单。
功能设计
- 读者管理子系统实现读者管理功能。
- 输入选项1-5分别对应显示读者信息、增加读者信息、查找读者信息、删除读者信息和修改读者信息五大功能。
- 输入0可以返回主菜单。
功能设计
- 实现对读者借书以及还书的信息进行登记的功能。
- 借书登记功能包括:输入读者编号,可以看到该读者的信息,输入要借的图书编号,满足条件,则可以实现借书操作。
- 还书登记功能包括:输入读者编号,可以看到该读者的信息。输入图书编号,满足条件,则可以实现归还操作。
#include八、项目总结#include #include #include #define LEN_BOOK sizeof(struct Book) #define LEN_READER sizeof(struct Reader) #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].iAmount,astReader[i].iMax,astReader[i].aiBookId #define BOOK_NUM 200 #define READER_NUM 100 int SearchBook(); int SearchReader(); 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 aiBookId[10]; }; struct Book astBook[BOOK_NUM]; struct Reader astReader[READER_NUM]; void ShowMainMenu() { system("cls"); printf("nnnnn"); 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("t|---------------------------------------------------------|n"); printf("n"); printf("tt请选择(0-3):"); } void ShowBookMenu() { system("cls"); printf("nnnnn"); 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("t|---------------------------------------------------------|n"); printf("n"); printf("tt请选择(0-5):"); } void ShowReaderMenu() { system("cls"); printf("nnnnn"); 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("t|---------------------------------------------------------|n"); printf("n"); printf("tt请选择(0-5):"); } void ShowBorrowReturnMenu() { system("cls"); printf("nnnnn"); printf("t|----------------------欢迎进入---------------------------|n"); printf("t| 借/还书登记 |n"); printf("t| 子菜单 |n"); printf("t| 1、借书登记 |n"); printf("t| 2、还书登记 |n"); printf("t| 0、返回主菜单 |n"); printf("t|---------------------------------------------------------|n"); printf("n"); printf("tt请选择(0-2):"); } void ShowModifyBookMenu() { printf("n"); printf("t| 1、编号 |n"); printf("t| 2、书名 |n"); printf("t| 3、作者 |n"); printf("t| 4、出版社 |n"); printf("t| 5、库存 |n"); printf("n"); printf("请输入所要修改的信息(键入相应的数字:1-5 ):"); } void ShowModifyReaderMenu() { printf("n"); printf("t| 1、编号 |n"); printf("t| 2、名字 |n"); printf("t| 3、性别 |n"); printf("t| 4、最大可借书数 |n"); printf("n"); printf("请输入所要修改的信息(键入相应的数字:1-4 )n"); } int ReadBookFile(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; } int ReadReaderFile(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) == 1) iReaderRecord ++; } fclose(pfReader); return iReaderRecord; } void SaveBookFile(int iBookId) { FILE *pfBook; pfBook = fopen("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 SaveReaderFile(int iReaderId) { FILE *pfReader; pfReader = fopen("reader.txt", "rb+"); if (pfReader != NULL) { fseek(pfReader, LEN_READER * iReaderId, SEEK_SET); if (fwrite(&astReader[iReaderId], LEN_READER, 1, pfReader) != 1) printf("无法保存该信息!n"); } fclose(pfReader); } void BorrowBook() { system("cls"); int iBookId,iReaderId, iBorrow,i; iReaderId = SearchReader(); if (iReaderId == -1) return; iBorrow = astReader[iReaderId].iMax - astReader[iReaderId].iAmount; if (iBorrow == 0) printf("该读者目前没有借任何书n"); else { printf("t该读者当前所借图书为:"); for (i = 0; i < iBorrow; i++) printf("%d ", astReader[iReaderId].aiBookId[i]); printf("nn"); } if (astReader[iReaderId].iAmount == 0) { printf("该读者可借书量为零,不能继续借书!n"); return; } printf("n按任意键输入要借阅的图书信息n"); getch(); iBookId = SearchBook(); if (iBookId == -1) return; if (astBook[iBookId].iAmount == 0) { printf("该图书库存量为零!图书不可借n"); return; } astReader[iReaderId].aiBookId[iBorrow] = astBook[iBookId].iNum; astBook[iBookId].iAmount--; astReader[iReaderId].iAmount--; SaveBookFile(iBookId); SaveReaderFile(iReaderId); printf("借书成功!n"); } void ReturnBook() { int iBookId, iReaderId, iBorrow,i,j; system("cls"); iReaderId = SearchReader(); if (iReaderId == -1) return; iBorrow = astReader[iReaderId].iMax - astReader[iReaderId].iAmount; if (iBorrow == 0) { printf("t该读者没有借任何书,无需归还n"); return; } else { printf("t该读者当前所借图书为:"); for (i = 0; i < iBorrow; i++) printf("%d ", astReader[iReaderId].aiBookId[i]); printf("nn"); } printf("按任意键输入要归还的图书信息n"); getch(); iBookId = SearchBook(); if (iBookId == -1) return; for (i = 0; i < iBorrow; i++) if (astReader[iReaderId].aiBookId[i] == astBook[iBookId].iNum) { for (j = i; j < iBorrow - 1; j++) astReader[iReaderId].aiBookId[j] = astReader[iReaderId].aiBookId[j + 1]; astReader[iReaderId].aiBookId[iBorrow] = 0; astBook[iBookId].iAmount++; astReader[iReaderId].iAmount++; break; } if (i == iBorrow) { printf("该读者没有借这本书,无需归还n"); return; } SaveBookFile(iBookId); SaveReaderFile(iReaderId); printf("还书成功!n"); } void ShowBook() { int i, iBookRecord; system("cls"); iBookRecord = ReadBookFile("rb"); if (iBookRecord == -1) printf("文件打开失败!请先新增加图书信息!n"); else if (iBookRecord == 0) printf("文件中没有图书信息!n"); else { printf("t|---------------------------------------------------------|n"); printf("t %-6s%-16s%-10s%-20s%-4sn","编号","书名","作者","出版社","库存"); for (i = 0; i < iBookRecord; i++) printf("t %-6d%-16s%-10s%-20s%-4dn", BOOK_DATA); printf("t|---------------------------------------------------------|n"); } } void AddBook() { FILE *pfBook; int iBookRecord, iFlagExist, i; char cFlag; system("cls"); iBookRecord = ReadBookFile("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("请输入图书名称:"); gets(astBook[iBookRecord].acName); printf("请输入图书作者:"); gets(astBook[iBookRecord].acAuthor); printf("请输入图书出版社:"); gets(astBook[iBookRecord].acPress); 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"); } void DeleteBook() { FILE *pfBook; int iBookId, iBookRecord, i; char cFlag; system("cls"); iBookId = SearchBook(); if (iBookId == -1) return; iBookRecord = ReadBookFile("rb"); printf("已找到该图书,是否删除?(y/n)"); cFlag = getchar(); getchar(); if (cFlag == 'n') return; else if (cFlag == 'y') { for (i = iBookId; 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", astBook[iBookId].iNum); } } void ModifyBook() { int iBookId, iBookRecord, iFlagExist, iItem, iNum, i; system("cls"); iBookId = SearchBook(); if (iBookId == -1) return; iBookRecord = ReadBookFile("rb"); ShowModifyBookMenu(); scanf("%d", &iItem); getchar(); switch (iItem) { case 1: printf("请输入图书编号:"); do{ iFlagExist = 0; scanf("%d", &iNum); getchar(); for (i = 0; i < iBookRecord; i++) { if (iNum == astBook[i].iNum && i != iBookId) { iFlagExist = 1; printf("错误,该图书编号已存在,请重新输入:"); break; } } } while (iFlagExist == 1); astBook[iBookId].iNum = iNum; break; case 2: printf("请输入图书名称:"); gets(astBook[iBookId].acName); break; case 3: printf("请输入图书作者:"); gets(astBook[iBookId].acAuthor); break; case 4: printf("请输入图书出版社:"); gets(astBook[iBookId].acPress); break; case 5: printf("请输入图书库存量:"); scanf("%d", &astBook[iBookId].iAmount); getchar(); break; } SaveBookFile(iBookId); printf("图书信息修改成功!n"); } int SearchBook() { int iBookNum, iBookRecord, iBookId, i; system("cls"); iBookRecord = ReadBookFile("rb"); if (iBookRecord == -1) { printf("文件打开失败!n"); printf("| 按任意键返回子菜单 |"); getch(); return -2; } else if (iBookRecord == 0) { printf("没有图书记录!n"); printf("| 按任意键返回子菜单 |"); getch(); return -3; } printf("请输入图书编号:"); scanf("%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%-4sn", "编号", "书名", "作者", "出版社", "库存"); printf("t %-6d%-16s%-10s%-20s%-4dn", BOOK_DATA); printf("t|---------------------------------------------------------|n"); break; } } if (i == iBookRecord) { printf("找不到%d号图书信息!n", iBookNum); iBookId = -1; } return iBookId; } void ShowReader() { int i, iReaderRecord; system("cls"); iReaderRecord = ReadReaderFile("rb"); if (iReaderRecord == -1) printf("文件打开失败!请先添加读者信息!n"); else if (iReaderRecord == 0) printf("文件中没有读者信息n"); else { printf("t|---------------------------------------------------------|n"); printf("t %-8s%-12s%-6s%-16s%-16sn","编号","姓名","性别","当前可借书数量","最大可借书数量"); for (i = 0; i < iReaderRecord; i++) printf("t %-8d%-12s%-6s%-16d%-16dn", READER_DATA); printf("t|---------------------------------------------------------|n"); } } void AddReader() { FILE *pfReader; int iFlagExist,iReaderRecord, i; char cFlag; system("cls"); iReaderRecord = ReadReaderFile("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("该读者编号已存在!请重新输入:"); } } } while (iFlagExist == 1); printf("请输入读者姓名:"); gets(astReader[iReaderRecord].acName); printf("请输入读者性别:F/M:"); while (gets(astReader[iReaderRecord].acSex) != NULL) { if (strcmp(astReader[iReaderRecord].acSex, "F") == 0 || strcmp(astReader[iReaderRecord].acSex, "M") == 0) break; printf("错误,只能输入'F'或者'M',请重新输入n"); } printf("请输入读者最大可借书数:(范围为5-10):"); while (scanf("%d", &astReader[iReaderRecord].iMax) == 1) { getchar(); if (astReader[iReaderRecord].iMax >= 5 && astReader[iReaderRecord].iMax <= 10) break; printf("错误,读者最大借阅数范围为5-10,请重新输入n"); } astReader[iReaderRecord].iAmount = astReader[iReaderRecord].iMax; for (i = 0; i < astReader[iReaderRecord].iMax; i++)//数组初始化为0,表示该读者一本书也没有借; astReader[iReaderRecord].aiBookId[i] = 0; if (fwrite(&astReader[iReaderRecord], LEN_READER, 1, pfReader) != 1) { printf("无法保存该信息!n"); } else { printf("%d号读者信息已保存!n", astReader[iReaderRecord].iNum); iReaderRecord++; } printf("继续输入信息吗(y/n)"); cFlag = getchar(); getchar(); } fclose(pfReader); printf("添加读者执行完毕!n"); } 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(); 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", astReader[iReaderId].iNum); } } void ModifyReader() { int iReaderId,iReaderRecord,iBorrow,iItem,iNum,iMax,iFlagExist,i; system("cls"); iReaderId = SearchReader(); if (iReaderId == -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 != iReaderId) { iFlagExist = 1; printf("错误,该读者编号已存在,请重新输入:n"); break; } } while (iFlagExist == 1); astReader[iReaderId].iNum = iNum; break; case 2: printf("请输入读者名字:"); gets(astReader[iReaderId].acName); break; case 3: printf("请输入读者性别:F/M:"); while (gets(astReader[iReaderId].acSex) != NULL) { if (strcmp(astReader[iReaderId].acSex, "F") == 0 || strcmp(astReader[iReaderId].acSex, "M") == 0) break; printf("错误,只能输入'F'或者'M',请重新输入n"); } break; case 4: iBorrow = astReader[iReaderId].iMax - astReader[iReaderId].iAmount; printf("请输入读者最大可借书数:(范围为5-10):"); while (scanf("%d", &iMax) == 1) { getchar(); if (iMax >= 5 && iMax <= 10) { if (iBorrow > iMax) { printf("该读者目前借阅图书数量大于该数目,需要先还书后修改!n"); return; } else { astReader[iReaderId].iMax = iMax; astReader[iReaderId].iAmount = iMax - iBorrow; for (i = iBorrow; i < iMax; i++) astReader[iReaderId].aiBookId[i] = 0; break; } } printf("错误,读者最大借阅数范围为5-10,请重新输入n"); } break; } SaveReaderFile(iReaderId); printf("读者信息修改成功!n"); } int SearchReader() { int iReaderNum,iReaderRecord, iReaderId, i; system("cls"); iReaderRecord = ReadReaderFile("rb"); if (iReaderRecord == -1) { printf("文件打开失败!n"); return -2; } else if (iReaderRecord == 0) { printf("没有读者记录!n"); return -3; } printf("请输入读者编号:"); scanf("%d", &iReaderNum); getchar(); for (i = 0; i < iReaderRecord; i++) { if (iReaderNum == astReader[i].iNum) { iReaderId = i; printf("%d号读者信息如下:n", iReaderNum); printf("t|---------------------------------------------------------|n"); printf("t %-8s%-12s%-6s%-16s%-16sn", "编号", "姓名", "性别", "当前可借书数量", "最大可借书数量"); printf("t %-8d%-12s%-6s%-16d%-16dn", READER_DATA); printf("t|---------------------------------------------------------|n"); printf("n"); break; } } if (i == iReaderRecord) { printf("找不到%d号读者信息!n", iReaderNum); iReaderId = -1; } return iReaderId; } void ManageBook() { int iItem; ShowBookMenu(); scanf("%d", &iItem); getchar(); while (iItem) { switch (iItem) { case 1: ShowBook(); break; case 2: AddBook(); break; case 3: SearchBook(); break; case 4: DeleteBook(); break; case 5: ModifyBook(); break; default: printf("tt请输入正确的数字!ntt"); } printf("| 按任意键返回子菜单 |"); getch(); ShowBookMenu(); scanf("%d", &iItem); getchar(); } } void ManageReader() { int iItem = 0; ShowReaderMenu(); scanf("%d", &iItem); getchar(); while (iItem) { switch (iItem) { case 1: ShowReader(); break; case 2: AddReader(); break; case 3: SearchReader(); break; case 4: DeleteReader(); break; case 5: ModifyReader(); break; default: printf("tt请输入正确的数字!ntt"); } printf("| 按任意键返回子菜单 |"); getch(); ShowReaderMenu(); scanf("%d", &iItem); getchar(); } } void BorrowReturnManage() { int iItem = 0; ShowBorrowReturnMenu(); scanf("%d", &iItem); getchar(); while (iItem) { switch (iItem) { case 1: BorrowBook(); break; case 2: ReturnBook(); break; default: printf("tt请输入正确的数字!ntt"); } printf("| 按任意键返回子菜单 |"); getch(); ShowBorrowReturnMenu(); scanf("%d", &iItem); getchar(); } } int main() { int iItem; ShowMainMenu(); scanf("%d", &iItem); getchar(); while (iItem) { switch (iItem) { case 1: ManageBook(); break; case 2: ManageReader(); break; case 3: BorrowReturnManage(); break; default: printf("tt请输入正确的数字!ntt程序将于3秒后跳转到主菜单"); Sleep(3000); } ShowMainMenu(); scanf("%d", &iItem); getchar(); } return 0; } derMenu(); scanf("%d", &iItem); getchar(); } } void BorrowReturnManage() { int iItem = 0; ShowBorrowReturnMenu(); scanf("%d", &iItem); getchar(); while (iItem) { switch (iItem) { case 1: BorrowBook(); break; case 2: ReturnBook(); break; default: printf("tt请输入正确的数字!ntt"); } printf("| 按任意键返回子菜单 |"); getch(); ShowBorrowReturnMenu(); scanf("%d", &iItem); getchar(); } } int main() { int iItem; ShowMainMenu(); scanf("%d", &iItem); getchar(); while (iItem) { switch (iItem) { case 1: ManageBook(); break; case 2: ManageReader(); break; case 3: BorrowReturnManage(); break; default: printf("tt请输入正确的数字!ntt程序将于3秒后跳转到主菜单"); Sleep(3000); } ShowMainMenu(); scanf("%d", &iItem); getchar(); } return 0; }
图书馆管理系统实现了对图书信息和读者信息的增、删、改、查管理功能,并且实现了借书登记和还书登记功能。
通过项目,学习到如下内容。
- 如何显示主功能菜单和响应用户输入
- 如何使用结构体数组记录信息
- 如何利用文件操作保存结果
- 如何进行函数封装使代码结构更清晰



