一個基於控制台的停車場管理系統,核心功能:
#define MAX 20 // 最大車位數
struct StopedCar {
char carNum[20]; // 車牌
char carshap[20]; // 車型
int areaNum; // 車位號
char stopedTime[30]; // 入場時間字符串
int h, m; // 入場時、分 (便於計費)
};
struct StopedCar stopedcar[MAX];
int total = 0; // 當前記錄數
int price = 1; // 單價 (元/分)
char password[20]; // 系統密碼
set_psw():雙次輸入驗證,存入 password.txt。psw_check():讀取文件比對,三次失敗鎖定退出。. 結束,模擬隱藏輸入 (未用 getch)。"rb"/"wb"/"ab" 直接讀寫結構體數組。Init() 啟動時載入 stopedcar.txt 到記憶體。"wb") 保證數據一致性。
// 獲取當前時間字符串
char* GetTime() {
time_t now; time(&now);
struct tm *t = localtime(&now);
return asctime(t); // 格式如 "Tue Jan 21 14:30:00 2025\n"
}
// 解析時分用於計費
int timeh() { /* 返回 tm_hour */ }
int timem() { /* 返回 tm_min */ }
// 計費邏輯:(當前分鐘數 - 入場分鐘數) * 單價
int Cost2(int h, int m, int danjia) {
int hnow = timeh(), mnow = timem();
return ((hnow - h) * 60 + (mnow - m)) * danjia;
}
注意:asctime 返回靜態緩衝區,多線程不安全;本單線程程式無妨。
// 檢查車位是否被佔用
int CheckNumber(int areaNum) {
for (int i = 0; i < total; i++)
if (stopedcar[i].areaNum == areaNum) return i; // 返回索引
return -1; // 空閒
}
// 停車登記
int Inputonecar(int i) {
int areaNum;
do { scanf("%d", &areaNum); } while (areaNum < 0 || areaNum > MAX);
if (CheckNumber(areaNum) >= 0) { puts("車位已佔用"); return 0; }
// ... 輸入車牌、車型、記錄時間 ...
return 1;
}
void GetCarByAreaNum2(FILE *fp) {
int no_temp, i = CheckNumber(no_temp);
if (i >= 0) {
Showonecarinfo(i);
if (confirm) {
printf("費用:%d 元\n", Cost2(stopedcar[i].h, stopedcar[i].m, price));
// 陣列前移覆蓋被刪記錄
for (int j = i; j < total - 1; j++)
stopedcar[j] = stopedcar[j+1];
total--;
// 重寫文件
for (int k = 0; k < total; k++) Inputfile(k, fp);
}
}
}
void menu() {
while (1) {
Show_menu();
switch (get_menu_choice()) {
case 1: Input(file_operate("ab")); break; // 新增
case 2: ShowAllCarInfo(); break; // 顯示全部
case 4: GetCarByAreaNum2(file_operate("wb")); break; // 按車位取車
case 7: SetPrice(); break; // 設定單價
case 8: set_psw(); break; // 修改密碼
case 0: return; // 退出
}
}
}
| 亮點 | 不足/改進建議 |
|---|---|
| 功能完整,邏輯清晰 | 固定陣列 MAX=20,擴展性差 → 改用鏈表/動態陣列 |
| 文件持久化正確 | 每次取車重寫整文件,效率低 → 隨機存取或資料庫 |
| 計費邏輯分離 | 時間解析依賴 asctime 固定格式,脆弱 → 用 strftime 或時間戳 |
| 密碼三次鎖定 | 明文存儲密碼 → 應存鹽值哈希 |
| 模塊化函數設計 | 全局變數過多,耦合度高 → 封裝為結構體/模塊 |
| 無車牌查詢/取車功能 (case 3/5/6 空實現) |
gcc parking.c -o parking
./parking
# 首次運行需設置密碼
Windows 下需鏈接 -lwinmm (若用 Sleep),或改用標準 sleep。
ncurses 或 PDCurses 做 TUI 介面。