【C語言】圖書管理系統(文件存儲版)丨源碼+詳解

一、系統介紹

這是一個基于C語言開發的終端圖書管理系統,采用鏈表數據結構?+?二進制文件存儲技術實現。系統具有以下特點:

  1. ?雙角色系統?:管理員(管理圖書)和讀者(借閱/歸還)
  2. ?完整功能?:圖書添加、搜索、借閱、歸還、顯示等功能
  3. ?數據持久化?:所有圖書信息保存在文件中,重啟不丟失
  4. ?健壯性設計?:完善的輸入驗證和錯誤處理

二、系統完整代碼

#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保存所有圖書數據,采用以下技術:

  1. ?序列化存儲?:直接將內存中的結構體寫入文件
  2. ?鏈表遍歷?:通過fwrite逐個節點寫入文件
  3. ?讀取加載?:啟動時重新構建鏈表結構
  4. ?自動保存?:每次數據變更后自動更新文件

四、使用說明

1. 編譯運行

?Windows系統:?

gcc library.c -o library
library.exe

?Linux/Mac系統:??

gcc library.c -o library
./library

2. 操作流程示例

?管理員操作:??

  1. 選擇"管理員登錄"
  2. 添加圖書:
  3. 搜索圖書:輸入"C程序"

讀者操作:??

  1. 選擇"讀者登錄",輸入任意ID(如:2023001)
  2. 借閱圖書:輸入ISBN號
  3. 查看圖書:選擇"查看所有圖書"
  4. 歸還圖書:選擇歸還并輸入ISBN號

3. 系統界面示例

======= 圖書管理系統 =======
1. 管理員登錄
2. 讀者登錄
0. 退出系統
請選擇: 1======= 管理員菜單 =======
1. 添加圖書
2. 搜索圖書
3. 查看所有圖書
0. 退出
請選擇操作: 1======== 添加新書 ========
ISBN: 1234567890
書名: C程序設計語言
作者: XXXX
總數量: 10圖書《C程序設計語言》添加成功!

五、擴展與優化建議

1. 可擴展功能

  1. ?借閱記錄持久化?:添加borrow.dat保存借閱記錄
  2. ?逾期計算?:根據借閱時間自動計算逾期費用
  3. ?管理員密碼?:增加管理員登錄驗證
  4. ?批量導入?:支持從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. 增強安全性

  1. ?輸入驗證?:添加更嚴格的ISBN格式檢查
  2. ?密碼加密?:管理員密碼使用MD5/SHA加密存儲
  3. ?訪問控制?:不同讀者只能查看自己的借閱記錄

六、總結

這個C語言圖書管理系統具有完整的功能實現、清晰的代碼結構和良好的擴展性,適合用作課程設計或學習項目。系統特點包括:

  1. 采用鏈表數據結構動態管理數據
  2. 文件存儲實現數據持久化
  3. 模塊化設計便于功能擴展
  4. 完整的輸入驗證和錯誤處理
  5. 跨平臺兼容性(Windows/Linux/Mac)

將整個代碼復制到library.c文件中即可編譯運行,無需任何外部依賴庫。

?資源推薦:

C/C++學習交流君羊

C/C++教程

C/C++學習路線,就業咨詢,技術提升

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83794.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java求職者面試題解析:Spring、Spring Boot、MyBatis框架與源碼原理

Java求職者面試題解析&#xff1a;Spring、Spring Boot、MyBatis框架與源碼原理 第一輪&#xff1a;基礎概念問題 1. 請解釋什么是Spring框架&#xff1f;它的核心特性有哪些&#xff1f; Spring是一個開源的Java/Java EE應用程序框架&#xff0c;用于簡化企業級應用開發。其…

【Chipyard】修改Gemmini 中PE的數量

實戰目標 PE數量擴大到原來4倍 原來配置 tileRows: Int 1,tileColumns: Int 1,meshRows: Int 16,meshColumns: Int 16, 改后配置 tileRows: Int 1,tileColumns: Int 1,meshRows: Int 32,meshColumns: Int 32, 修改配置 1. 修改gemmini的scala配置文件&#xff0c;用…

TCP客戶端進程分割輸入輸出

創建TCP客戶端&#xff0c;創建子進程分割TCP客戶端的read功能和write功能&#xff0c;實現分割I/O的目的。加快客戶端速率。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include …

Wi-Fi 6 在 2.4GHz 頻段的速率與優化分析

Wi-Fi 6&#xff08;802.11ax&#xff09;在 2.4GHz 和 5GHz 頻段均可工作&#xff0c;理論最高速率可達 1200 Mbps&#xff08;5GHz&#xff0c;80MHz&#xff0c;22 MIMO&#xff09;。但在 2.4GHz 頻段&#xff0c;速率受 信道寬度、MIMO、調制方式、干擾、協議開銷 影響&am…

WPF--Application.Current.Dispatcher.BeginInvoke

1.代碼示例 private void LogInfoList_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) {// 直接在這里修改集合會引發遞歸if (e.Action NotifyCollectionChangedAction.Add){if (logInfoList.Count > 200){logInfoList.RemoveAt(0); // 這里會…

ZooKeeper詳解以及應用部署(AI)

ZooKeeper 是一個開源的分布式協調服務框架&#xff0c;旨在為分布式應用提供一致性保障和關鍵協調功能。其核心設計理念是將復雜的分布式一致性邏輯封裝為簡單可靠的接口&#xff0c;讓開發者專注于業務邏輯而非底層協調難題。以下是其核心要點&#xff1a; &#x1f9e0; 一、…

將MySQL數據庫中所有表和字段編碼統一改為utf8mb4_unicode_ci

完整操作步驟 1. 首先修改數據庫默認字符集 sql ALTER DATABASE 你的數據庫名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2. 生成批量修改所有表的SQL語句 sql SELECT CONCAT(ALTER TABLE , table_schema, ., table_name, CONVERT TO CHARACTER SET utf8mb4 C…

jupyterhub的淺淺使用-重點在解決無法登錄

jupyterhub的淺淺使用-重點在解決無法登錄 jupyterhub的淺淺使用-重點在解決無法登錄1、jupyterhub是什么2、創建Dockerfile3、啟動容器3.1、生成配置文件jupyterhub --generate-config3.2、運行容器3.3、進入容器配置用戶密碼3.4、訪問127.0.0.1:8000并登錄 4、后臺創建的用戶…

【Bitcoin基礎】比特幣的地址格式有哪些?如何應用?

比特幣地址格式的分類及應用場景 比特幣地址是用于接收和發送比特幣的標識符&#xff0c;主要有以下幾種格式&#xff0c;每中類型都有其特定的用途和特點: 比特幣地址格式 P2PKH 1xxxx leagcy地址 P2SH 3xxxx 允許更復雜的交易多重簽名 bech32 bc1xxxx bech32mP2TR…

3.1.2_棧的順序存儲實現

知識總覽&#xff1a; 順序棧的定義&#xff1a; 順序棧是用順序存儲實現的 &#xff0c;代碼定義方式和順序表類似(啥是順序表來著&#xff1f;&#xff1f;&#xff1f;) 定義一個順序棧struct結構體SqStack&#xff0c;結構體中有靜態數組data來存放棧里邊的元素1個int型的…

JavaEE初階第一期:計算機是如何 “思考” 的(上)

專欄&#xff1a;JavaEE初階起飛計劃 個人主頁&#xff1a;手握風云 一、馮諾依曼體系結構 1.1. 概念 馮諾依曼體系結構&#xff08;Von Neumann Architecture&#xff09;&#xff0c;是現代計算機的基礎設計概念&#xff0c;核心思想是“存儲程序控制”。具體來說&#xff0c…

SQL Server全局搜索:在整個數據庫中查找特定值的高效方法

SQL Server全局搜索&#xff1a;在整個數據庫中查找特定值的高效方法 一、需求背景&#xff1a;為什么需要數據庫全局搜索&#xff1f; 在數據庫管理和開發過程中&#xff0c;我們經常會遇到這樣的場景&#xff1a; 只記得某個數據值&#xff0c;但忘記了它所在的表或列需要…

萬物皆數:構建數字信號處理的數學基石

萬物皆數&#xff1a;構建數字信號處理的數學基石 歡迎來到數字信號處理&#xff08;DSP&#xff09;的世界。在這里&#xff0c;聲音、圖像、通信信號、醫療數據……一切信息都被轉化為一串串冰冷的數字。然而&#xff0c;正是通過對這些數字的精妙運算&#xff0c;我們得以實…

到院率最高提升40%,消費醫療用AI營銷機器人跑贏增長焦慮

當前&#xff0c;消費醫療機構普遍依賴人工咨詢師進行客戶接待和營銷咨詢。然而&#xff0c;專業咨詢師缺口高達20萬人&#xff0c;大量“護士轉咨詢”“銷售轉咨詢”現象導致方案設計專業性不足&#xff0c;客戶投訴率提升40%。人工客服不僅醫學知識薄弱&#xff0c;學習能力有…

【推薦算法】注意力機制與興趣演化:推薦系統如何抓住用戶的心?

注意力機制與興趣演化&#xff1a;推薦系統如何抓住用戶的心&#xff1f; 一、算法背景知識&#xff1a;從靜態推薦到動態感知1.1 傳統推薦系統的局限性1.2 人類注意力機制的啟示 二、算法理論/結構&#xff1a;動態興趣建模革命2.1 DIN&#xff08;深度興趣網絡&#xff09;&a…

快速入門:創建 Azure 數據資源管理器群集和數據庫

前言 Azure 數據資源管理器是 Microsoft 提供的一項快速、完全托管的數據分析服務。 它允許用戶分析來自應用程序、網站、物聯網設備等的海量數據流,從而簡化復雜的數據探索。 它能夠處理數 PB 的數據,并支持快速檢索數據以進行分析。 主要特點 高性能:ADX 針對快速數據提…

Redis集群模式之Redis Cluster(2)

上篇文章我們講解了Redis Cluster中的主要模塊和兩種重定向方式&#xff0c;這篇文章我們來講解一下Redis Cluster的狀態監測和維護。 Redis Cluster狀態監測及維護 要講解Redis Cluster中節點的狀態如何維護&#xff0c;我們要先知道Redis Cluster中的節點有哪些狀態&#xf…

Step-Audio-AQAA 解讀:邁向「純語音」交互的端到端 LALM 新里程

引言:AI 從聽到說 大型音頻語言模型(Large Audio-Language Models, LALMs)正在徹底改變我們與機器交互的方式。我們不再滿足于簡單的文本問答,而是期望 AI 能夠像人類一樣,通過自然的語音進行交流,理解我們的意圖,并以富有表現力的聲音回應。然而,構建一個能夠直接從語…

基于邊緣計算的絲桿狀態實時監測系統設計?

基于邊緣計算的絲桿狀態實時監測系統設計&#xff0c;可從系統架構、各層功能設計、關鍵技術應用等方面入手&#xff0c;以下為詳細介紹&#xff1a; 系統架構設計 基于邊緣計算的絲桿狀態實時監測系統通常由感知層、邊緣層和云端三部分組成。感知層負責數據采集&#xff0c;…

LeetCode 每日一題 2025/6/9-2025/6/15

記錄了初步解題思路 以及本地實現代碼&#xff1b;并不一定為最優 也希望大家能一起探討 一起進步 目錄 6/9 440. 字典序的第K小數字6/10 3442. 奇偶頻次間的最大差值 I6/11 3445. 奇偶頻次間的最大差值 II6/12 3423. 循環數組中相鄰元素的最大差值6/13 2616. 最小化數對的最大…