项目概述与需求分析
1 项目名称
基于C语言的简易图书管理系统

(图片来源网络,侵删)
2 项目目标
设计并实现一个命令行界面的图书管理系统,能够对图书信息进行基本的增、删、改、查操作,并将数据持久化存储在文件中,确保程序关闭后数据不丢失。
3 功能需求分析
系统应具备以下核心功能:
- 图书信息录入:能够添加新的图书信息,包括书名、作者、ISBN编号、库存数量等。
- 图书信息浏览:能够以列表形式展示所有图书的信息。
- 图书信息查询:支持按书名或作者进行模糊查询,并显示查询结果。
- 图书信息修改:能够根据ISBN编号查找到特定图书,并修改其信息(如书名、作者、库存等)。
- 图书信息删除:能够根据ISBN编号从系统中删除指定的图书。
- 数据持久化:系统启动时能从文件中加载图书数据,退出时能将当前所有图书数据保存到文件中。
- 用户界面:提供清晰、友好的菜单驱动界面,引导用户进行操作。
功能模块设计
根据需求分析,可以将系统划分为以下几个功能模块:
- 主菜单模块:程序的入口,显示所有可用功能选项,并根据用户输入调用相应功能。
- 图书信息管理模块:
addBook():添加图书。displayBooks():浏览所有图书。searchBook():查询图书。modifyBook():修改图书信息。deleteBook():删除图书。
- 数据持久化模块:
saveToFile():将图书数组中的数据写入文件。loadFromFile():从文件中读取数据到图书数组。
- 辅助功能模块:
clearScreen():清屏函数,优化界面显示。pause():暂停函数,让用户看清结果后继续。
数据结构设计
为了存储和管理图书信息,我们需要定义一个结构体 Book 来表示单本图书。

(图片来源网络,侵删)
// 图书结构体
typedef struct {
char title[100]; // 书名
char author[50]; // 作者
char isbn[20]; // ISBN编号,作为唯一标识
int quantity; // 库存数量
} Book;
// 图书管理系统结构体
typedef struct {
Book books[MAX_BOOKS]; // 图书数组
int count; // 当前图书数量
} Library;
Book结构体:存储单本图书的详细信息。Library结构体:管理整个图书馆,它包含一个Book类型的数组和一个整数count用于追踪当前存储的图书数量,使用结构体来封装所有数据,便于管理。MAX_BOOKS:定义一个最大图书容量常量,防止数组越界。
核心代码实现
下面是完整的C语言代码,包含了上述所有功能模块和设计。
library_system.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h> // 用于 getch(),Windows平台下可用,Linux/macOS需替换
#define MAX_BOOKS 1000
#define FILENAME "library.dat"
// 图书结构体
typedef struct {
char title[100];
char author[50];
char isbn[20];
int quantity;
} Book;
// 图书管理系统结构体
typedef struct {
Book books[MAX_BOOKS];
int count;
} Library;
// 函数声明
void initLibrary(Library *lib);
void showMenu();
void addBook(Library *lib);
void displayBooks(const Library *lib);
void searchBook(const Library *lib);
void modifyBook(Library *lib);
void deleteBook(Library *lib);
void saveToFile(const Library *lib);
void loadFromFile(Library *lib);
void clearScreen();
void pause();
int main() {
Library lib;
initLibrary(&lib);
loadFromFile(&lib);
int choice;
do {
showMenu();
printf("请输入您的选择: ");
scanf("%d", &choice);
while (getchar() != '\n'); // 清除输入缓冲区
switch (choice) {
case 1:
addBook(&lib);
break;
case 2:
displayBooks(&lib);
break;
case 3:
searchBook(&lib);
break;
case 4:
modifyBook(&lib);
break;
case 5:
deleteBook(&lib);
break;
case 0:
printf("正在保存数据并退出系统...\n");
saveToFile(&lib);
pause();
break;
default:
printf("无效的选择,请重新输入!\n");
pause();
break;
}
} while (choice != 0);
return 0;
}
// 初始化图书馆
void initLibrary(Library *lib) {
lib->count = 0;
}
// 显示主菜单
void showMenu() {
clearScreen();
printf("========================================\n");
printf("|| C语言图书管理系统 ||\n");
printf("========================================\n");
printf("|| 1. 添加图书 ||\n");
printf("|| 2. 浏览所有图书 ||\n");
printf("|| 3. 查询图书 ||\n");
printf("|| 4. 修改图书信息 ||\n");
printf("|| 5. 删除图书 ||\n");
printf("|| 0. 退出系统 ||\n");
printf("========================================\n");
}
// 添加图书
void addBook(Library *lib) {
if (lib->count >= MAX_BOOKS) {
printf("图书馆已满,无法添加更多图书!\n");
pause();
return;
}
Book newBook;
printf("请输入书名: ");
fgets(newBook.title, sizeof(newBook.title), stdin);
newBook.title[strcspn(newBook.title, "\n")] = 0; // 去掉换行符
printf("请输入作者: ");
fgets(newBook.author, sizeof(newBook.author), stdin);
newBook.author[strcspn(newBook.author, "\n")] = 0;
printf("请输入ISBN编号: ");
fgets(newBook.isbn, sizeof(newBook.isbn), stdin);
newBook.isbn[strcspn(newBook.isbn, "\n")] = 0;
printf("请输入库存数量: ");
scanf("%d", &newBook.quantity);
while (getchar() != '\n'); // 清除输入缓冲区
// 检查ISBN是否已存在
for (int i = 0; i < lib->count; i++) {
if (strcmp(lib->books[i].isbn, newBook.isbn) == 0) {
printf("错误:该ISBN编号已存在!\n");
pause();
return;
}
}
lib->books[lib->count++] = newBook;
printf("图书添加成功!\n");
pause();
}
// 浏览所有图书
void displayBooks(const Library *lib) {
clearScreen();
if (lib->count == 0) {
printf("图书馆中暂无图书,\n");
pause();
return;
}
printf("%-30s %-20s %-15s %s\n", "书名", "作者", "ISBN", "库存");
printf("------------------------------------------------------------\n");
for (int i = 0; i < lib->count; i++) {
printf("%-30s %-20s %-15s %d\n", lib->books[i].title, lib->books[i].author, lib->books[i].isbn, lib->books[i].quantity);
}
pause();
}
// 查询图书
void searchBook(const Library *lib) {
clearScreen();
if (lib->count == 0) {
printf("图书馆中暂无图书,\n");
pause();
return;
}
int option;
char keyword[100];
printf("请选择查询方式:\n");
printf("1. 按书名查询\n");
printf("2. 按作者查询\n");
printf("请输入选择: ");
scanf("%d", &option);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入查询关键词: ");
fgets(keyword, sizeof(keyword), stdin);
keyword[strcspn(keyword, "\n")] = 0;
printf("\n查询结果:\n");
printf("%-30s %-20s %-15s %s\n", "书名", "作者", "ISBN", "库存");
printf("------------------------------------------------------------\n");
int found = 0;
for (int i = 0; i < lib->count; i++) {
if ((option == 1 && strstr(lib->books[i].title, keyword) != NULL) ||
(option == 2 && strstr(lib->books[i].author, keyword) != NULL)) {
printf("%-30s %-20s %-15s %d\n", lib->books[i].title, lib->books[i].author, lib->books[i].isbn, lib->books[i].quantity);
found = 1;
}
}
if (!found) {
printf("未找到匹配的图书,\n");
}
pause();
}
// 修改图书信息
void modifyBook(Library *lib) {
clearScreen();
if (lib->count == 0) {
printf("图书馆中暂无图书,\n");
pause();
return;
}
char isbn[20];
printf("请输入要修改的图书ISBN编号: ");
fgets(isbn, sizeof(isbn), stdin);
isbn[strcspn(isbn, "\n")] = 0;
for (int i = 0; i < lib->count; i++) {
if (strcmp(lib->books[i].isbn, isbn) == 0) {
printf("找到图书: %s\n", lib->books[i].title);
printf("请输入新的书名 (留空则不修改): ");
char newTitle[100];
fgets(newTitle, sizeof(newTitle), stdin);
if (strlen(newTitle) > 1) { // 如果输入了内容(包括换行符)
newTitle[strcspn(newTitle, "\n")] = 0;
strcpy(lib->books[i].title, newTitle);
}
printf("请输入新的作者 (留空则不修改): ");
char newAuthor[50];
fgets(newAuthor, sizeof(newAuthor), stdin);
if (strlen(newAuthor) > 1) {
newAuthor[strcspn(newAuthor, "\n")] = 0;
strcpy(lib->books[i].author, newAuthor);
}
printf("请输入新的库存数量 (输入-1则不修改): ");
int newQuantity;
scanf("%d", &newQuantity);
while (getchar() != '\n'); // 清除输入缓冲区
if (newQuantity != -1) {
lib->books[i].quantity = newQuantity;
}
printf("图书信息修改成功!\n");
pause();
return;
}
}
printf("未找到该ISBN编号的图书!\n");
pause();
}
// 删除图书
void deleteBook(Library *lib) {
clearScreen();
if (lib->count == 0) {
printf("图书馆中暂无图书,\n");
pause();
return;
}
char isbn[20];
printf("请输入要删除的图书ISBN编号: ");
fgets(isbn, sizeof(isbn), stdin);
isbn[strcspn(isbn, "\n")] = 0;
for (int i = 0; i < lib->count; i++) {
if (strcmp(lib->books[i].isbn, isbn) == 0) {
// 将后面的所有元素前移
for (int j = i; j < lib->count - 1; j++) {
lib->books[j] = lib->books[j + 1];
}
lib->count--;
printf("图书删除成功!\n");
pause();
return;
}
}
printf("未找到该ISBN编号的图书!\n");
pause();
}
// 保存数据到文件
void saveToFile(const Library *lib) {
FILE *fp = fopen(FILENAME, "wb");
if (fp == NULL) {
perror("无法打开文件进行写入");
return;
}
fwrite(lib, sizeof(Library), 1, fp);
fclose(fp);
}
// 从文件加载数据
void loadFromFile(Library *lib) {
FILE *fp = fopen(FILENAME, "rb");
if (fp == NULL) {
// 文件不存在是正常情况(第一次运行)
return;
}
fread(lib, sizeof(Library), 1, fp);
fclose(fp);
}
// 清屏函数 (Windows)
void clearScreen() {
system("cls");
}
// 暂停函数
void pause() {
printf("\n按任意键继续...");
getch(); // Windows
// Linux/macOS下可以使用: system("read -p ''");
}
编译与运行指南
1 环境准备
- 编译器:你需要一个C语言编译器,如 GCC (MinGW on Windows), Clang, 或 Visual Studio。
- 开发环境:任何文本编辑器(如 VS Code, Sublime Text)或集成开发环境(如 Dev-C++, Visual Studio Code, CLion)。
2 编译步骤
-
将上述代码保存为
library_system.c文件。 -
打开终端或命令提示符。
-
使用GCC进行编译:
gcc library_system.c -o library_system
- Linux/macOS用户注意:代码中使用了
conio.h和getch(),这在标准C库中不存在,你需要进行替换:- 删除
#include <conio.h>。 - 将
pause()函数中的getch()替换为system("read -p ''");。 - 或者,你可以使用一个跨平台的
getch()实现。
- 删除
- Linux/macOS用户注意:代码中使用了
-
编译成功后,会生成一个可执行文件
library_system.exe(Windows) 或library_system(Linux/macOS)。
3 运行程序
在终端中,进入可执行文件所在的目录,然后运行:
./library_system
程序启动后,你将看到一个菜单界面,可以根据提示进行操作。
项目扩展与改进建议
这个基础版本已经满足了课程设计的基本要求,如果你想让它更完善,可以考虑以下扩展方向:
- 用户认证系统:增加管理员和普通用户两种角色,拥有不同的操作权限。
- 借阅与归还功能:
- 增加
Reader(读者) 结构体。 - 实现
borrowBook()和returnBook()函数。 - 记录借阅历史。
- 增加
- 数据结构优化:使用链表代替数组,这样可以动态分配内存,避免
MAX_BOOKS的限制,更灵活地管理图书数量。 - 排序功能:增加按书名、作者、入库时间等对图书列表进行排序的功能。
- 图形用户界面:使用如
GTK+,Qt或EasyX(Windows) 等库,将命令行界面升级为图形界面,提升用户体验。 - 代码结构优化:将每个功能模块的代码拆分到不同的
.c和.h文件中,实现更好的模块化和代码复用。
希望这份详细的指南能帮助你顺利完成C语言课程设计!祝你成功!
