圖書管理系統是C語言教學與實踐中的經典專案,能夠全面鍛煉結構體、檔案操作、鏈表、模組化程式設計等核心技能。本文提供一個完整的設計思路與核心代碼框架,幫助你從零構建功能完善的圖書管理系統。
根據題目要求,系統需實現以下核心功能:
// 圖書信息結構體
typedef struct Book {
char id[20]; // 書號
char title[50]; // 書名
char author[30]; // 作者
float price; // 定價
int quantity; // 館藏數量
struct Book *next; // 鏈表指針
} Book;
// 入庫記錄結構體
typedef struct StockIn {
char bookId[20]; // 書號
float unitPrice; // 單價
int amount; // 數量
float subtotal; // 小計
char date[15]; // 入庫日期 (YYYY-MM-DD)
struct StockIn *next;
} StockIn;
| 模組 | 函數原型 | 功能描述 |
|---|---|---|
| 初始化 | void initSystem(Book **head, StockIn **stockHead) | 從檔案載入數據,建立鏈表 |
| 圖書增刪改查 | void addBook(Book **head)void deleteBook(Book **head, char *id)void modifyBook(Book *head, char *id)Book* findBook(Book *head, char *id) | 實現圖書信息的完整CRUD操作 |
| 入庫登記 | void stockIn(Book *bookHead, StockIn **stockHead) | 輸入書號驗證存在性,記錄入庫信息,更新圖書數量 |
| 入庫統計 | void queryStockIn(StockIn *stockHead, char *bookId) | 按書號統計總入庫量,顯示明細記錄 |
| 數據保存 | void saveBooks(Book *head)void saveStockIn(StockIn *head) | 程式退出時將鏈表數據寫入檔案 |
| 主選單 | void showMenu()int main() | 提供文字介面交互,調用上述功能 |
1. 檔案操作策略
採用二進制檔案(wb/rb)存儲結構體數組,或文本檔案(fprintf/fscanf)按行存儲。建議程式啟動時一次性讀入記憶體鏈表,退出時統一寫回,平衡效能與數據安全。
2. 入庫與庫存聯動
在stockIn函數中,首先遍歷圖書鏈表驗證書號是否存在,若存在則修改quantity字段,同時創建入庫記錄節點插入入庫鏈表,最後調用保存函數持久化兩個鏈表。
3. 日期處理
使用time.h庫獲取系統時間,格式化為YYYY-MM-DD字符串存入入庫記錄。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
// 結構體定義見上文
// 函數聲明
void initSystem(Book **head, StockIn **stockHead);
void addBook(Book **head);
void deleteBook(Book **head, char *id);
void modifyBook(Book *head, char *id);
Book* findBook(Book *head, char *id);
void stockIn(Book *bookHead, StockIn **stockHead);
void queryStockIn(StockIn *stockHead, char *bookId);
void saveBooks(Book *head);
void saveStockIn(StockIn *head);
void showMenu();
void freeList(Book *head);
void freeStockList(StockIn *head);
int main() {
Book *bookHead = NULL;
StockIn *stockHead = NULL;
initSystem(&bookHead, &stockHead);
int choice;
while(1) {
showMenu();
scanf("%d", &choice);
switch(choice) {
case 1: addBook(&bookHead); break;
case 2: {
char id[20];
printf("請輸入要刪除的書號: ");
scanf("%s", id);
deleteBook(&bookHead, id);
break;
}
case 3: {
char id[20];
printf("請輸入要修改的書號: ");
scanf("%s", id);
modifyBook(bookHead, id);
break;
}
case 4: {
char id[20];
printf("請輸入要查詢的書號: ");
scanf("%s", id);
Book *b = findBook(bookHead, id);
if(b) printf("書號:%s 書名:%s 作者:%s 價格:%.2f 數量:%d\n",
b->id, b->title, b->author, b->price, b->quantity);
else printf("未找到該圖書\n");
break;
}
case 5: stockIn(bookHead, &stockHead); break;
case 6: {
char id[20];
printf("請輸入要統計的書號: ");
scanf("%s", id);
queryStockIn(stockHead, id);
break;
}
case 7:
saveBooks(bookHead);
saveStockIn(stockHead);
freeList(bookHead);
freeStockList(stockHead);
printf("感謝使用,再見!\n");
return 0;
default: printf("輸入錯誤,請重新選擇\n");
}
}
return 0;
}
// 具體函數實現略...
sqlite3替代平檔存儲,支援SQL查詢ncurses庫構建文本介面(TUI)提升交互體驗通過完成這個專案,你將掌握C語言中結構體鏈表、檔案IO、模組化設計、記憶體管理等核心技能,為後續學習數據結構、作業系統、嵌入式開發打下堅實基礎。