zhuang8026/TKU-C-Final_Exam
GitHub: zhuang8026/TKU-C-Final_Exam
以C語言實作停車場核心邏輯(Stack/Queue/Linked List),經Python Flask提供API,前端即時顯示停車格地圖的教學專案。
Stars: 0 | Forks: 0
# 停車場管理系統 — Parking Lot Management System
淡江大學 C 語言期末專案
以 C 語言實作停車場核心邏輯,透過 Python Flask 提供 HTTP API,前端以純 HTML/CSS/JavaScript 呈現即時畫面。
## 功能介紹
| 功能 | 說明 |
|------|------|
| 停車格地圖 | 3×3 格停車場,即時顯示每格的佔用狀態與車牌 |
| 入場 | 輸入車牌,有空位直接停入;車位滿則自動加入候位佇列 |
| 出場 | 僅限最後入場的車輛可直接離開(LIFO 單排車道);若被擋住則顯示需先移出的車牌清單 |
| 候位自動入場 | 車輛出場後,候位佇列中的第一台車自動填入空出的格位 |
| 歷史查詢 | 輸入車牌,顯示所有入場與出場時間紀錄 |
## 使用技術
| 層次 | 技術 | 說明 |
|------|------|------|
| 核心邏輯 | C 語言 | struct、pointer、malloc/free、2D array、Stack、Queue、Linked List、Dynamic Array |
| 後端 API | Python 3 + Flask | 接收 HTTP 請求,透過 subprocess 呼叫 C 執行檔 |
| 跨來源支援 | flask-cors | 允許前端與後端不同 port 的請求 |
| 前端畫面 | HTML / CSS / JavaScript | fetch API 呼叫 Flask,動態渲染停車格地圖 |
| 狀態持久化 | 二進位檔 `lot_state.bin` | 每次 subprocess 執行結束前序列化寫檔,下次啟動讀取還原 |
### C 語言 9 項需求對應
| 需求 | 對應實作 |
|------|---------|
| 函式拆分 | 四個 .c 檔各司其職(parking.c / data_structures.c / logic.c / main.c) |
| struct | `Vehicle`、`ParkingSpot`、`Stack`、`Queue`、`Record`、`LotState` |
| malloc / free | `init_lot` 配置、`free_lot` 釋放,所有節點皆動態配置 |
| pointer | 雙層指標 `ParkingSpot **grid`、函式參數傳址、`->` 運算子 |
| dynamic array | `search_history` 以 realloc 實作可擴張的查詢結果緩衝區 |
| 2D array | `grid[ROWS][COLS]` 以雙層指標動態配置 |
| linked list | `Record *history_head` 歷史紀錄鏈結串列 |
| stack | 以 linked list 實作的 LIFO 停車道(`Stack` + `StackNode`) |
| queue | 以 linked list 實作的 FIFO 候位佇列(`Queue` + `QueueNode`) |
## 系統架構
瀏覽器 (HTML/CSS/JS)
│ HTTP fetch
▼
Python Flask (server/app.py) ←→ subprocess
│
▼
C 執行檔 (core/parking)
│ 讀寫
▼
lot_state.bin(二進位狀態檔)
### 目錄結構
TKU-C-Final_Exam_v2/
├── core/ # C 語言核心
│ ├── parking.h # struct 定義與函式宣告
│ ├── parking.c # 初始化與記憶體釋放
│ ├── data_structures.c # Stack / Queue / Grid / Linked List 操作
│ ├── logic.c # 業務邏輯(入場 / 出場 / 歷史查詢)
│ ├── main.c # CLI 入口,解析指令,輸出 JSON
│ └── README.md
├── server/ # Python Flask 後端
│ ├── app.py # HTTP 路由
│ └── README.md
├── client/ # 前端畫面
│ ├── index.html
│ ├── style.css
│ ├── app.js
│ └── README.md
├── .gitignore
└── README.md # 總文件說明
## 專案啟動方式
### 步驟一:編譯 C 核心
cd core
gcc -o parking parking.c data_structures.c logic.c main.c
### 步驟二:安裝 Python 套件
cd server
python3 -m venv venv
source venv/bin/activate
pip install flask flask-cors
### 步驟三:啟動 Flask
cd server
source venv/bin/activate
python app.py
Flask 啟動後監聽於 `http://127.0.0.1:5000`
### 步驟四:開啟前端
直接用瀏覽器開啟 `client/index.html`(無需 Web Server)。
## Claude AI Prompt 使用紀錄
以下為本專案開發過程中與 Claude AI 的對話摘要,依開發順序記錄。
| # | Prompt 內容 | 說明 |
|---|-------------|------|
| 1 | 分析圖片中所有的需求 | 從需求截圖提取 9 項 C 語言評分標準 |
| 2 | 這是未來的架構(附架構圖) | 確認 Browser → Flask → C 的三層架構 |
| 3 | 依照目前的需求,做什麼專案或者遊戲,比較適合? | 探索符合所有需求的專案類型 |
| 4 | 停車場管理,你沒有規劃到指標 | 補充 pointer 的使用設計(雙層指標 grid) |
| 5 | 這是專案需求,另外建立文件 | 建立 REQUIREMENTS.md 等設計文件 |
| 6 | 實作之前,要記得區分 core / server / client | 確認目錄分層與職責劃分 |
| 7 | 開始實作第一層(struct 定義) | 建立 parking.h,定義所有 struct |
| 8 | 進去第二層(init/free) | 建立 parking.c,實作 init_lot / free_lot |
| 9 | 繼續第三層(資料結構操作) | 建立 data_structures.c,實作 Stack / Queue / Grid / History |
| 10 | ds.c 為什麼這樣命名?有更好命名嗎? | 將 ds.c 重新命名為 data_structures.c |
| 11 | 把所有的邏輯都放在 parking.c 是好的嗎? | 決定拆出 logic.c,分離業務邏輯與資料結構 |
| 12 | 繼續第四層(業務邏輯) | 建立 logic.c,實作 park_vehicle / exit_vehicle / search_history |
| 13 | 更新 README,繼續第五層 | 建立 main.c,實作 CLI 介面與 lot_state.bin 持久化 |
| 14 | lot_state.bin 文件是什麼?怎麼樣才會出現這個問題? | 說明 subprocess 每次建立新行程導致狀態消失的問題與解法 |
| 15 | 繼續第六層(Flask) | 建立 server/app.py,實作 4 條 HTTP 路由 |
| 16 | 先測試到目前是否有問題 | 逐項驗證所有 API 路由與 C 執行結果 |
| 17 | 到目前位置,哪些文件是不用上 github? | 建立 .gitignore(C 執行檔、lot_state.bin、venv、__pycache__) |
| 18 | 開始第七層(前端) | 建立 client/ 三檔案,完成停車場地圖與操作面板 |
| 19 | 檢查到目前為止有沒有什麼問題 | 全面檢查編譯、功能測試、API 路由、前端邏輯 |
| 20 | 在最外層建立 readme(本次) | 建立本文件,對整個專案進行完整說明 |
标签:2D array, API, Flask, flask-cors, HTML/CSS/JavaScript, HTTP API, LIFO, malloc/free, subprocess, 二进制持久化, 候位队列, 停车位管理, 停车场管理系统, 前端, 动态数组, 历史查询, 多模态安全, 学习项目, 实时显示, 客户端加密, 指针, 数据可视化, 数据结构, 期末项目, 栈, 淡江大学, 逆向工具, 链表, 队列