案例:图书馆管理系统(管理员版)
背景:
随着信息技术的发展和普及,传统的图书馆管理方式已经无法满足现代图书馆高效、便捷、智能化的管理需求。传统的手工登记、纸质档案管理不仅耗时耗力,而且容易出现错误,导致图书资源的浪费和读者体验的下降。因此,开发一套高效的图书馆管理系统成为了提升图书馆服务质量和管理水平的迫切需求。
题目要求:
开发一个图书馆管理系统实现以下功能
增加图书
1.输入:管理员输入图书的详细信息。
2.处理:系统验证信息的有效性,并将图书信息存储到数据库中。
3.输出:提示管理员图书添加成功,并在图书列表中显示新增的图书。
查找图书
1.输入:管理员输入查找对应图书的编码和书名即可查找。
2.处理:系统根据条件在数据库中检索匹配的图书。
3.输出:返回查找结果,显示符合条件的图书列表。
删除图书
1.输入:管理员选择要删除的图书编码或者书名。
2.处理:系统确认删除操作,并从数据库中移除该图书的信息。
3.输出:提示删除成功,并更新图书列表。
显示图书
1.输入:无。
2.处理:系统从数据库中读取所有图书信息。
3.输出:显示所有图书的列表。
归还图书
1.输入:管理员选择要借出的图书编码或者书名。
2.处理:系统记录归还信息,更新图书的库存状态。
3.输出:提示归还成功,并更新归还记录。
借阅图书
1.输入:管理员选择要借出的图书编码或者书名。
2.处理:系统记录借阅信息,更新图书的库存状态。
3.输出:提示借阅成功,并更新借阅记录。
退出系统
1.输入:管理员选择退出系统的选项。
2.处理:系统保存当前状态,并关闭所有运行中的进程。
3.输出:显示退出系统的确认信息。
5. 安全性
对于未能查询到的图书创建异常处理机制来提高系统安全性与稳定性
开始
|
|---程序启动,初始化:
| library[] 和 bookCount = 0
|
|---主菜单
|
|---用户选择:
| (1) 添加图书
| (2) 显示所有图书
| (3) 查找图书
| (4) 借阅图书
| (5) 归还图书
| (6) 删除图书
| (7) 退出程序
|
|---添加图书 (addBook):
| 提示用户输入图书信息
| 创建新书籍对象
| library[bookCount] = 新书籍对象
| bookCount++
| 回到主菜单
|
|---显示所有图书 (displayAllBooks):
| 遍历 library[] 并打印图书信息
| 回到主菜单
|
|---查找图书 (findBook):
| 询问用户选择按 ID 还是书名
| 根据选择搜索 library[]
| 显示搜索结果
| 回到主菜单
|
|---借阅图书 (borrowBook):
| 询问用户选择按 ID 还是书名
| 根据选择执行借阅操作
| 回到主菜单
|
|---归还图书 (returnBook):
| 询问用户选择按 ID 还是书名
| 根据选择执行归还操作
| 回到主菜单
|
|---删除图书 (deleteBook):
| 询问用户选择按 ID 还是书名
| 根据选择执行删除操作
| 回到主菜单
|
|---退出程序
|
结束
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>#define FILENAME "D:\\Filedemo\\library.txt"
#define MAX_BOOKS 100
#define NAME_LENGTH 50
#define AUTHOR_LENGTH 50typedef struct {int id;char title[NAME_LENGTH];char author[AUTHOR_LENGTH];float price;char category[NAME_LENGTH];bool borrowed;
} Book;Book library[MAX_BOOKS];
int bookCount = 0;// 声明图书馆数组和图书计数变量
Book library[MAX_BOOKS];// 保存图书信息到文件的函数
void saveBooksToFile() {FILE *file = fopen(FILENAME, "wb"); // 打开文件以二进制写入模式if (file == NULL) { // 检查文件是否成功打开printf("Error opening file for writing.\n");return; // 如果打开失败,打印错误信息并返回}fwrite(library, sizeof(Book), bookCount, file); // 将图书数据写入文件fclose(file); // 关闭文件
}// 从文件加载图书信息的函数
void loadBooksFromFile() {FILE *file = fopen(FILENAME, "rb"); // 打开文件以二进制读取模式if (file == NULL) { // 检查文件是否成功打开printf("No existing library data found.\n");return; // 如果没有找到数据,打印信息并返回}bookCount = fread(library, sizeof(Book), MAX_BOOKS, file); // 从文件读取图书数据fclose(file); // 关闭文件
}// 添加新图书的函数
void addBook() {if (bookCount >= MAX_BOOKS) { // 检查是否达到最大图书数量printf("抱歉,无法增加图书.\n");return; // 如果达到上限,打印信息并返回}Book newBook; // 创建一个新的图书结构体// 获取用户输入的图书信息printf("请输入图书书名: ");scanf("%s", newBook.title);printf("请输入图书作者: ");scanf("%s", newBook.author);printf("请输入图书价格: ");scanf("%f", &newBook.price);printf("请输入图书类型: ");scanf("%s", newBook.category);newBook.borrowed = false; // 默认图书未被借出newBook.id = bookCount + 1; // 设置图书IDlibrary[bookCount++] = newBook; // 将新图书添加到图书馆数组中saveBooksToFile(); // 保存图书信息到文件printf("增加图书成功.\n"); // 打印成功信息
}// 显示所有图书
void displayAllBooks() {for (int i = 0; i < bookCount; i++) { // 遍历图书馆中的所有图书// 打印每本图书的详细信息,包括ID、书名、作者、价格、类型和借阅状态printf("ID: %d, 书名: %s, 作者: %s, 价格: %.2f, 类型: %s, 是否被借: %s\n",library[i].id, library[i].title, library[i].author, library[i].price, library[i].category,library[i].borrowed ? "是" : "否"); // 使用三元运算符判断图书是否被借出}
}// 查找图书
void findBook() {int choice; // 用于存储用户选择的查找方式// 提示用户选择查找方式,并读取用户的选择printf("请选择查找方式:\n1. 按ID查找\n2. 按书名查找\n");scanf("%d", &choice);if (choice == 1) { // 如果用户选择按ID查找int id; // 用于存储用户输入的图书ID// 提示用户输入要查找的图书ID,并读取用户输入的图书IDprintf("请输入要查找的图书ID: ");scanf("%d", &id);// 遍历图书馆中的所有图书,查找匹配的图书IDfor (int i = 0; i < bookCount; i++) {if (library[i].id == id) { // 如果找到匹配的图书ID// 打印找到的图书的详细信息,包括ID、书名、作者、价格、类型和借阅状态printf("找到了图书:\nID: %d, 书名: %s, 作者: %s, 价格: %.2f, 类型: %s, 是否被借: %s\n",library[i].id, library[i].title, library[i].author, library[i].price, library[i].category,library[i].borrowed ? "是" : "否");return; // 查找完成,函数返回}}// 如果没有找到匹配的图书ID,打印提示信息printf("未找到ID为 %d 的图书。\n", id);} else if (choice == 2) { // 如果用户选择按书名查找char title[NAME_LENGTH]; // 用于存储用户输入的图书书名// 提示用户输入要查找的图书书名,并读取用户输入的图书书名printf("请输入要查找的图书书名: ");scanf("%s", title);// 遍历图书馆中的所有图书,查找匹配的图书书名for (int i = 0; i < bookCount; i++) {if (strcmp(library[i].title, title) == 0) { // 如果找到匹配的图书书名// 打印找到的图书的详细信息,包括ID、书名、作者、价格、类型和借阅状态printf("找到了图书:\nID: %d, 书名: %s, 作者: %s, 价格: %.2f, 类型: %s, 是否被借: %s\n",library[i].id, library[i].title, library[i].author, library[i].price, library[i].category,library[i].borrowed ? "是" : "否");return; // 查找完成,函数返回}}// 如果没有找到匹配的图书书名,打印提示信息printf("未找到书名为 '%s' 的图书。\n", title);} else { // 如果用户选择了无效的选项// 打印提示信息,告知用户选择无效printf("无效的选择,请重新输入。\n");}
}// 借阅图书
void borrowBook() {int choice; // 用于存储用户选择的借阅方式// 提示用户选择借阅方式,并读取用户的选择printf("请选择借阅方式:\n1. 按ID借阅\n2. 按书名借阅\n");scanf("%d", &choice);if (choice == 1) { // 如果用户选择按ID借阅int id; // 用于存储用户输入的图书ID// 提示用户输入要借阅的图书ID,并读取用户输入的图书IDprintf("请输入要借阅的图书ID: ");scanf("%d", &id);// 遍历图书馆中的所有图书,查找匹配的图书IDfor (int i = 0; i < bookCount; i++) {if (library[i].id == id && !library[i].borrowed) { // 如果找到未被借出的匹配图书IDlibrary[i].borrowed = true; // 标记图书为已借出状态saveBooksToFile(); // 保存图书信息到文件,以便数据持久化printf("借阅图书成功。\n"); // 打印借阅成功的消息return; // 借阅完成,函数返回}}// 如果没有找到匹配的图书ID,或者图书已被借出,打印提示信息printf("未找到ID为 %d 的图书,或者该图书已被借出,借阅失败。\n", id);} else if (choice == 2) { // 如果用户选择按书名借阅char title[NAME_LENGTH]; // 用于存储用户输入的图书书名// 提示用户输入要借阅的图书书名,并读取用户输入的图书书名printf("请输入要借阅的图书书名: ");scanf("%s", title);// 遍历图书馆中的所有图书,查找匹配的图书书名for (int i = 0; i < bookCount; i++) {if (strcmp(library[i].title, title) == 0 && !library[i].borrowed) { // 如果找到未被借出的匹配图书书名library[i].borrowed = true; // 标记图书为已借出状态saveBooksToFile(); // 保存图书信息到文件,以便数据持久化printf("借阅图书成功。\n"); // 打印借阅成功的消息return; // 借阅完成,函数返回}}// 如果没有找到匹配的图书书名,或者图书已被借出,打印提示信息printf("未找到书名为 '%s' 的图书,或者该图书已被借出,借阅失败。\n", title);} else { // 如果用户选择了无效的选项// 打印提示信息,告知用户选择无效printf("无效的选择,请重新输入。\n");}
}
// 归还图书的函数
void returnBook() {int choice; // 用于存储用户选择的归还方式// 提示用户选择归还方式,并读取用户的选择printf("请选择归还方式:\n1. 按ID归还\n2. 按书名归还\n");scanf("%d", &choice);if (choice == 1) { // 如果用户选择按ID归还int id; // 用于存储用户输入的图书ID// 提示用户输入要归还的图书ID,并读取用户输入的图书IDprintf("请输入要归还的图书ID: ");scanf("%d", &id);// 遍历图书馆中的所有图书,查找匹配的图书IDfor (int i = 0; i < bookCount; i++) {if (library[i].id == id && library[i].borrowed) { // 如果找到已借出的匹配图书IDlibrary[i].borrowed = false; // 标记图书为未借出状态saveBooksToFile(); // 保存图书信息到文件,以便数据持久化printf("归还图书成功。\n"); // 打印归还成功的消息return; // 归还完成,函数返回}}// 如果没有找到匹配的图书ID,或者图书未被借出,打印提示信息printf("未找到ID为 %d 的图书,或者该图书未被借出,归还失败。\n", id);} else if (choice == 2) { // 如果用户选择按书名归还char title[NAME_LENGTH]; // 用于存储用户输入的图书书名// 提示用户输入要归还的图书书名,并读取用户输入的图书书名printf("请输入要归还的图书书名: ");scanf("%s", title);// 遍历图书馆中的所有图书,查找匹配的图书书名for (int i = 0; i < bookCount; i++) {if (strcmp(library[i].title, title) == 0 && library[i].borrowed) { // 如果找到已借出的匹配图书书名library[i].borrowed = false; // 标记图书为未借出状态saveBooksToFile(); // 保存图书信息到文件,以便数据持久化printf("归还图书成功。\n"); // 打印归还成功的消息return; // 归还完成,函数返回}}// 如果没有找到匹配的图书书名,或者图书未被借出,打印提示信息printf("未找到书名为 '%s' 的图书,或者该图书未被借出,归还失败。\n", title);} else { // 如果用户选择了无效的选项// 打印提示信息,告知用户选择无效printf("无效的选择,请重新输入。\n");}
}
//删除图书
void deleteBook() {int choice;printf("请选择删除方式:\n1. 按ID删除\n2. 按书名删除\n");scanf("%d", &choice);if (choice == 1) {int id;printf("请输入要删除的图书ID: ");scanf("%d", &id);for (int i = 0; i < bookCount; i++) {if (library[i].id == id) {// 将找到的图书之后的所有图书向前移动一位for (int j = i; j < bookCount - 1; j++) {library[j] = library[j + 1];}// 更新图书数量bookCount--;// 保存更改到文件saveBooksToFile();printf("图书删除成功。\n");return;}}printf("未找到ID为 %d 的图书,删除失败。\n", id);} else if (choice == 2) {char title[NAME_LENGTH];printf("请输入要删除的图书书名: ");scanf("%s", title);for (int i = 0; i < bookCount; i++) {if (strcmp(library[i].title, title) == 0) {// 将找到的图书之后的所有图书向前移动一位for (int j = i; j < bookCount - 1; j++) {library[j] = library[j + 1];}// 更新图书数量bookCount--;// 保存更改到文件saveBooksToFile();printf("图书删除成功。\n");return;}}printf("未找到书名为 '%s' 的图书,删除失败。\n", title);} else {printf("无效的选择,请重新输入。\n");}
}
int main() {loadBooksFromFile();int choice;while (1) {printf("*************************图书馆管理系统*********************\n");printf("1. 增加图书\n");printf("2. 展示所有图书\n");printf("3. 查找图书\n");printf("4. 借阅图书\n");printf("5. 归还图书\n");printf("6. 删除图书\n");printf("7. 退出程序\n");printf("请选择操作: ");scanf("%d", &choice);switch (choice) {case 1:addBook();break;case 2:displayAllBooks();break;case 3:findBook();break;case 4:borrowBook();break;case 5:returnBook();break;case 6:deleteBook();break;case 7:exit(0);default:printf("无效的选择,请重新输入。\n");}}return 0;
}
运行结果: