c语言图书管理系统源代码:include
基于C语言的图书管理系统源代码实现与功能解析

图书管理系统是现代图书馆管理中不可或缺的工具,它能够高效地实现图书的录入、查询、借阅、归还等操作,本文将通过一个基于C语言开发的图书管理系统源代码,详细解析其设计思路与实现方法,该系统采用文件存储数据,界面简洁,功能完整,适合初学者学习和实际应用。
系统功能设计
该图书管理系统具备以下核心功能:

- 图书录入:输入图书信息并保存到文件中。
- 图书查询:按书名、作者或ISBN号查询图书。
- 借阅管理:记录读者借阅图书信息。
- 归还管理:记录图书归还信息。
- 图书显示:显示当前所有图书信息。
- 数据存储:使用文件存储图书和借阅记录,确保数据持久化。
源代码实现
以下是完整的C语言图书管理系统源代码,代码中包含详细注释,便于理解。
#include <string.h>
#include <ctype.h>
#define MAX_BOOKS 100 // 最大图书数量
#define MAX_AUTHORS 50 // 最大作者长度
#define MAX_TITLE 100 // 最大书名长度
#define MAX_ID 20 // 最大ISBN长度
// 图书结构体
typedef struct {
char id[MAX_ID]; // 图书ID
char title[MAX_TITLE]; // 书名
char author[MAX_AUTHORS]; // 作者
int available; // 是否可借(1表示可借,0表示已借出)
} Book;
// 借阅记录结构体
typedef struct {
char book_id[MAX_ID]; // 图书ID
char reader_name[50]; // 读者姓名
char borrow_date[20]; // 借阅日期
char return_date[20]; // 归还日期
} BorrowRecord;
// 全局变量
Book books[MAX_BOOKS]; // 存储图书信息
BorrowRecord borrow_records[100]; // 存储借阅记录
int book_count = 0; // 当前图书数量
int record_count = 0; // 当前借阅记录数量
// 函数声明
void add_book(); // 添加新图书
void display_books(); // 显示所有图书
void search_book(); // 查询图书
void borrow_book(); // 借阅图书
void return_book(); // 归还图书
void save_books(); // 保存图书数据到文件
void load_books(); // 从文件加载图书数据
void save_records(); // 保存借阅记录到文件
void load_records(); // 从文件加载借阅记录
// 主函数
int main() {
int choice;
load_books();
load_records();
while (1) {
printf("\n===== 图书管理系统 =====\n");
printf("1. 添加图书\n");
printf("2. 显示所有图书\n");
printf("3. 查询图书\n");
printf("4. 借阅图书\n");
printf("5. 归还图书\n");
printf("6. 退出系统\n");
printf("请选择操作(1-6):");
scanf("%d", &choice);
getchar(); // 清除缓冲区
switch (choice) {
case 1:
add_book();
save_books();
break;
case 2:
display_books();
break;
case 3:
search_book();
break;
case 4:
borrow_book();
save_records();
break;
case 5:
return_book();
save_records();
break;
case 6:
printf("退出系统...\n");
save_books();
save_records();
exit(0);
default:
printf("无效的选择,请重新输入!\n");
}
}
return 0;
}
// 添加新图书
void add_book() {
if (book_count >= MAX_BOOKS) {
printf("图书数量已达上限!\n");
return;
}
Book new_book;
printf("\n添加新图书:\n");
printf("图书ID: ");
fgets(new_book.id, MAX_ID, stdin);
new_book.id[strcspn(new_book.id, "\n")] = '\0'; // 去除换行符
printf("书名: ");
fgets(new_book.title, MAX_TITLE, stdin);
new_book.title[strcspn(new_book.title, "\n")] = '\0';
printf("作者: ");
fgets(new_book.author, MAX_AUTHORS, stdin);
new_book.author[strcspn(new_book.author, "\n")] = '\0';
new_book.available = 1; // 默认可借
books[book_count++] = new_book;
printf("图书添加成功!\n");
}
// 显示所有图书
void display_books() {
printf("\n===== 图书列表 =====\n");
printf("ID\t\t书名\t\t作者\t\t状态\n");
for (int i = 0; i < book_count; i++) {
printf("%s\t%s\t%s\t%s\n",
books[i].id,
books[i].title,
books[i].author,
books[i].available ? "可借" : "已借出");
}
printf("===== 图书列表结束 =====\n");
}
// 查询图书
void search_book() {
char search_id[MAX_ID];
printf("\n输入要查询的图书ID:");
fgets(search_id, MAX_ID, stdin);
search_id[strcspn(search_id, "\n")] = '\0';
for (int i = 0; i < book_count; i++) {
if (strcmp(books[i].id, search_id) == 0) {
printf("\n图书信息:\n");
printf("ID: %s\n", books[i].id);
printf("书名: %s\n", books[i].title);
printf("作者: %s\n", books[i].author);
printf("状态: %s\n", books[i].available ? "可借" : "已借出");
return;
}
}
printf("未找到该图书!\n");
}
// 借阅图书
void borrow_book() {
char book_id[MAX_ID];
char reader_name[50];
printf("\n借阅图书:\n");
printf("图书ID: ");
fgets(book_id, MAX_ID, stdin);
book_id[strcspn(book_id, "\n")] = '\0';
printf("借阅人姓名: ");
fgets(reader_name, 50, stdin);
reader_name[strcspn(reader_name, "\n")] = '\0';
for (int i = 0; i < book_count; i++) {
if (strcmp(books[i].id, book_id) == 0 && books[i].available) {
BorrowRecord new_record;
strcpy(new_record.book_id, book_id);
strcpy(new_record.reader_name, reader_name);
// 获取当前日期作为借阅日期
time_t t = time(NULL);
struct tm *tm = localtime(&t);
char date[20];
sprintf(date, "%d-%02d-%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
strcpy(new_record.borrow_date, date);
// 归还日期暂设为30天后
tm->tm_mon += 30;
t = mktime(tm);
strftime(date, sizeof(date), "%Y-%m-%d", tm);
strcpy(new_record.return_date, date);
borrow_records[record_count++] = new_record;
books[i].available = 0; // 更新图书状态为已借出
printf("借阅成功!归还日期为:%s\n", new_record.return_date);
return;
}
}
printf("未找到该图书或图书已借出!\n");
}
// 归还图书
void return_book() {
char book_id[MAX_ID];
printf("\n归还图书:\n");
printf("图书ID: ");
fgets(book_id, MAX_ID, stdin);
book_id[strcspn(book_id, "\n")] = '\0';
for (int i = 0; i < book_count; i++) {
if (strcmp(books[i].id, book_id) == 0 && !books[i].available) {
books[i].available = 1; // 更新图书状态为可借
printf("图书归还成功!\n");
// 这里可以添加超期处理逻辑
return;
}
}
printf("未找到该图书或图书未借出!\n");
}
// 保存图书数据到文件
void save_books() {
FILE *file = fopen("books.dat", "wb");
if (file == NULL) {
printf("保存图书数据失败!\n");
return;
}
fwrite(&book_count, sizeof(int), 1, file);
fwrite(books, sizeof(Book), book_count, file);
fclose(file);
}
// 从文件加载图书数据
void load_books() {
FILE *file = fopen("books.dat", "rb");
if (file == NULL) {
// 文件不存在,初始化为空
return;
}
fread(&book_count, sizeof(int), 1, file);
fread(books, sizeof(Book), book_count, file);
fclose(file);
}
// 保存借阅记录到文件
void save_records() {
FILE *file = fopen("records.dat", "wb");
if (file == NULL) {
printf("保存借阅记录失败!\n");
return;
}
fwrite(&record_count, sizeof(int), 1, file);
fwrite(borrow_records, sizeof(BorrowRecord), record_count, file);
fclose(file);
}
// 从文件加载借阅记录
void load_records() {
FILE *file = fopen("records.dat", "rb");
if (file == NULL) {
// 文件不存在,初始化为空
return;
}
fread(&record_count, sizeof(int), 1, file);
fread(borrow_records, sizeof(BorrowRecord), record_count, file);
fclose(file);
} 代码解析
数据结构:
Book结构体存储图书的基本信息,包括ID、书名、作者和借阅状态。BorrowRecord结构体记录借阅信息,包括图书ID、借阅人姓名、借阅日期和归还日期。
文件操作:
- 系统使用文件
books.dat和records.dat存储图书和借阅记录,确保程序关闭后数据不丢失。
- 系统使用文件
功能实现:
- 添加图书:通过
add_book()函数实现,输入图书信息并保存到数组中。 - 显示图书:通过
display_books()函数遍历数组并打印所有图书信息。 - 查询图书:通过
search_book()函数根据ID查找图书。 - 借阅/归还:通过
borrow_book()和return_book()函数实现,更新图书状态并记录借阅信息。
- 添加图书:通过
扩展建议
- 用户登录:可以添加用户登录功能,区分读者和管理员权限。
- 超期提醒:在归还时检查是否超期,并计算罚款。
- 图形界面:使用 GTK、Qt 等库开发图形界面,提升用户体验。
- 数据库支持:使用 MySQL 或 SQLite 替代文件存储,提高数据管理能力。

相关文章:
文章已关闭评论!










