网站建设站,申请域名要多少钱,wordpress头像大小不一,计算机哪个专业好一、系统介绍
这是一个基于C语言开发的终端图书管理系统#xff0c;采用链表数据结构二进制文件存储技术实现。系统具有以下特点#xff1a;
双角色系统#xff1a;管理员#xff08;管理图书#xff09;和读者#xff08;借阅/归还#xff09;完整功能采用链表数据结构二进制文件存储技术实现。系统具有以下特点
双角色系统管理员管理图书和读者借阅/归还完整功能图书添加、搜索、借阅、归还、显示等功能数据持久化所有图书信息保存在文件中重启不丢失健壮性设计完善的输入验证和错误处理
二、系统完整代码
#include stdio.h
#include stdlib.h
#include string.h
#include time.h/* 宏定义 */
#define MAX_NAME 50 // 名称最大长度
#define MAX_ID 20 // ID最大长度
#if defined(_WIN32)#define CLEAR_SCREEN system(cls) // Windows清屏
#else#define CLEAR_SCREEN system(clear) // Linux/Mac清屏
#endif/* 数据结构 */
// 图书结构
typedef struct Book {char isbn[MAX_ID]; // ISBN号char title[MAX_NAME]; // 书名char author[MAX_NAME]; // 作者int total_count; // 总数量int available_count; // 可借数量struct Book *next; // 链表指针
} Book;// 借阅记录
typedef struct BorrowRecord {char user_id[MAX_ID]; // 借阅者IDchar book_isbn[MAX_ID]; // 图书ISBNtime_t borrow_date; // 借书日期时间戳time_t return_date; // 还书日期struct BorrowRecord *next; // 链表指针
} BorrowRecord;/* 全局变量 */
Book *book_list NULL; // 图书链表头指针
BorrowRecord *borrow_list NULL; // 借阅记录链表头指针/************************************* 工具函数清空输入缓冲区************************************/
void clear_input_buffer() {int c;while ((c getchar()) ! \n c ! EOF);
}/************************************* 数据加载从文件读取图书数据************************************/
void load_books() {FILE *fp fopen(books.dat, rb);if (fp NULL) return;Book book_temp;while (fread(book_temp, sizeof(Book), 1, fp) 1) {Book *new_book (Book*)malloc(sizeof(Book));*new_book book_temp;new_book-next book_list;book_list new_book;}fclose(fp);
}/************************************* 数据保存将当前图书数据写入文件************************************/
void save_books() {FILE *fp fopen(books.dat, wb);if (fp NULL) {printf(错误无法保存数据\n);return;}Book *current book_list;while (current ! NULL) {fwrite(current, sizeof(Book), 1, fp);current current-next;}fclose(fp);
}/************************************* 功能添加新书管理员权限************************************/
void add_book() {CLEAR_SCREEN;printf(\n 添加新书 \n);Book *new_book (Book*)malloc(sizeof(Book));// 输入ISBN并查重printf(ISBN: );scanf(%19s, new_book-isbn);clear_input_buffer();Book *current book_list;while (current ! NULL) {if (strcmp(current-isbn, new_book-isbn) 0) {printf(错误ISBN已存在\n);free(new_book);return;}current current-next;}// 输入其他信息printf(书名: );fgets(new_book-title, MAX_NAME, stdin);new_book-title[strcspn(new_book-title, \n)] \0; // 去掉换行符printf(作者: );fgets(new_book-author, MAX_NAME, stdin);new_book-author[strcspn(new_book-author, \n)] \0;printf(总数量: );scanf(%d, new_book-total_count);new_book-available_count new_book-total_count;clear_input_buffer();// 插入链表new_book-next book_list;book_list new_book;printf(\n图书《%s》添加成功\n, new_book-title);save_books(); // 保存到文件
}/************************************* 功能按关键字搜索图书支持模糊搜索************************************/
void search_book() {CLEAR_SCREEN;printf(\n 图书搜索 \n);char keyword[MAX_NAME];printf(输入ISBN/书名/作者关键字: );fgets(keyword, MAX_NAME, stdin);keyword[strcspn(keyword, \n)] \0; // 去掉换行符if (strlen(keyword) 0) {printf(搜索内容不能为空\n);return;}Book *current book_list;int found 0;while (current ! NULL) {// 检查ISBN、书名、作者是否匹配if (strstr(current-isbn, keyword) ! NULL || strstr(current-title, keyword) ! NULL || strstr(current-author, keyword) ! NULL) {printf(\n--------------------);printf(\nISBN: %s\n书名: %s\n作者: %s\n数量: %d/%d\n,current-isbn, current-title, current-author,current-available_count, current-total_count);found 1;}current current-next;}if (!found) {printf(未找到匹配的图书\n);}
}/************************************* 功能借阅图书读者权限************************************/
void borrow_book(char *user_id) {CLEAR_SCREEN;printf(\n 借阅图书 \n);char isbn[MAX_ID];printf(输入要借阅的图书ISBN: );scanf(%19s, isbn);clear_input_buffer();// 查找图书Book *book book_list;while (book ! NULL) {if (strcmp(book-isbn, isbn) 0) break;book book-next;}// 检查图书状态if (book NULL) {printf(错误找不到该图书\n);return;} else if (book-available_count 0) {printf(错误该书已全部借出\n);return;}// 创建借阅记录BorrowRecord *record (BorrowRecord*)malloc(sizeof(BorrowRecord));strcpy(record-user_id, user_id);strcpy(record-book_isbn, isbn);record-borrow_date time(NULL); // 当前时间record-return_date 0; // 0表示未归还// 更新图书库存book-available_count--;// 添加记录到链表record-next borrow_list;borrow_list record;printf(\n借阅成功\n);printf(归还期限: 30天内\n);printf(借阅时间: %s, ctime(record-borrow_date));save_books(); // 保存库存变更
}/************************************* 功能归还图书读者权限************************************/
void return_book(char *user_id) {CLEAR_SCREEN;printf(\n 归还图书 \n);char isbn[MAX_ID];printf(输入要归还的图书ISBN: );scanf(%19s, isbn);clear_input_buffer();// 查找借阅记录未归还状态BorrowRecord *prev NULL;BorrowRecord *current borrow_list;int found 0;while (current ! NULL) {if (strcmp(current-user_id, user_id) 0 strcmp(current-book_isbn, isbn) 0 current-return_date 0) {found 1;// 更新图书库存Book *book book_list;while (book ! NULL) {if (strcmp(book-isbn, isbn) 0) {book-available_count;break;}book book-next;}// 更新归还日期current-return_date time(NULL);printf(\n归还成功\n);printf(归还时间: %s, ctime(current-return_date));save_books();return;}prev current;current current-next;}if (!found) {printf(错误未找到借阅记录或已归还\n);}
}/************************************* 功能显示所有图书信息************************************/
void display_all_books() {CLEAR_SCREEN;printf(\n 所有图书 \n);printf(%-15s %-25s %-20s %-10s\n, ISBN, 书名, 作者, 库存(可借/总数));Book *current book_list;while (current ! NULL) {printf(%-15s %-25s %-20s %d/%d\n, current-isbn, current-title, current-author, current-available_count, current-total_count);current current-next;}
}/************************************* 管理员菜单************************************/
void admin_menu() {int choice;while (1) {CLEAR_SCREEN;printf(\n 管理员菜单 \n);printf(1. 添加图书\n);printf(2. 搜索图书\n);printf(3. 查看所有图书\n);printf(0. 退出\n);printf(请选择操作: );scanf(%d, choice);clear_input_buffer();switch (choice) {case 1: add_book(); break;case 2: search_book(); break;case 3: display_all_books(); break;case 0: return;default: printf(无效选择\n);}printf(\n按回车键继续...);getchar();}
}/************************************* 读者菜单************************************/
void reader_menu(char *user_id) {int choice;while (1) {CLEAR_SCREEN;printf(\n 读者菜单 \n);printf(读者ID: %s\n, user_id);printf(1. 借阅图书\n);printf(2. 归还图书\n);printf(3. 搜索图书\n);printf(4. 查看所有图书\n);printf(0. 退出\n);printf(请选择操作: );scanf(%d, choice);clear_input_buffer();switch (choice) {case 1: borrow_book(user_id); break;case 2: return_book(user_id); break;case 3: search_book(); break;case 4: display_all_books(); break;case 0: return;default: printf(无效选择\n);}printf(\n按回车键继续...);getchar();}
}/************************************* 主函数************************************/
int main() {load_books(); // 启动时加载图书数据while (1) {CLEAR_SCREEN;printf( 图书管理系统 \n);printf(1. 管理员登录\n);printf(2. 读者登录\n);printf(0. 退出系统\n);printf(请选择: );int option;if (scanf(%d, option) ! 1) {clear_input_buffer();continue;}clear_input_buffer();switch (option) {case 1: admin_menu(); break;case 2: {char user_id[MAX_ID];printf(请输入读者ID: );fgets(user_id, MAX_ID, stdin);user_id[strcspn(user_id, \n)] \0;reader_menu(user_id);break;}case 0: {// 程序退出前保存数据save_books();printf(感谢使用再见\n);return 0;}default: printf(无效选择\n);}}
}
三、系统功能详解
1. 主要功能模块
功能模块描述访问权限图书添加添加新书到系统包含ISBN、书名、作者等信息管理员图书搜索通过ISBN、书名或作者关键字查找图书所有用户借阅管理借阅图书并自动记录借阅时间和读者ID读者归还管理归还已借阅图书并更新库存读者图书显示以表格形式展示所有图书信息所有用户
2. 数据结构设计 3. 文件存储机制
系统使用二进制文件books.dat保存所有图书数据采用以下技术
序列化存储直接将内存中的结构体写入文件链表遍历通过fwrite逐个节点写入文件读取加载启动时重新构建链表结构自动保存每次数据变更后自动更新文件 四、使用说明
1. 编译运行
Windows系统
gcc library.c -o library
library.exe
Linux/Mac系统
gcc library.c -o library
./library 2. 操作流程示例
管理员操作
选择管理员登录添加图书搜索图书输入C程序
读者操作
选择读者登录输入任意ID如2023001借阅图书输入ISBN号查看图书选择查看所有图书归还图书选择归还并输入ISBN号
3. 系统界面示例 图书管理系统
1. 管理员登录
2. 读者登录
0. 退出系统
请选择: 1 管理员菜单
1. 添加图书
2. 搜索图书
3. 查看所有图书
0. 退出
请选择操作: 1 添加新书
ISBN: 1234567890
书名: C程序设计语言
作者: XXXX
总数量: 10图书《C程序设计语言》添加成功
五、扩展与优化建议
1. 可扩展功能
借阅记录持久化添加borrow.dat保存借阅记录逾期计算根据借阅时间自动计算逾期费用管理员密码增加管理员登录验证批量导入支持从CSV文件批量导入图书
2. 性能优化
// 示例优化查找函数哈希表实现
#define HASH_SIZE 100typedef struct HashTable {Book *table[HASH_SIZE];
} HashTable;// ISBN哈希函数
unsigned int hash_function(char *isbn) {unsigned int hash 0;for (int i 0; i strlen(isbn); i) {hash 31 * hash isbn[i];}return hash % HASH_SIZE;
}// 添加图书到哈希表
void add_to_hash(Book *book, HashTable *hash_table) {unsigned int index hash_function(book-isbn);book-next hash_table-table[index];hash_table-table[index] book;
}
3. 增强安全性
输入验证添加更严格的ISBN格式检查密码加密管理员密码使用MD5/SHA加密存储访问控制不同读者只能查看自己的借阅记录
六、总结
这个C语言图书管理系统具有完整的功能实现、清晰的代码结构和良好的扩展性适合用作课程设计或学习项目。系统特点包括
采用链表数据结构动态管理数据文件存储实现数据持久化模块化设计便于功能扩展完整的输入验证和错误处理跨平台兼容性Windows/Linux/Mac
将整个代码复制到library.c文件中即可编译运行无需任何外部依赖库。 资源推荐
C/C学习交流君羊
C/C教程
C/C学习路线就业咨询技术提升