首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言實戰項目:停車場管理系統完整源碼解析 (含密碼驗證、文件持久化、費用計算)

     編輯:關於C語言

專案概覽

一個基於控制台的停車場管理系統,核心功能:

  • 管理員密碼驗證 (三次鎖定)
  • 車位資訊管理 (編號、狀態、收費標準)
  • 停車登記 (車牌、車型、車位、入場時間)
  • 取車結算 (依停車時長自動計費)
  • 數據文件持久化 (二進制讀寫)
  • 查詢、修改、排序、顯示所有記錄

核心數據結構


#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];      // 系統密碼

關鍵模塊實現

1. 密碼系統

  • set_psw():雙次輸入驗證,存入 password.txt。
  • psw_check():讀取文件比對,三次失敗鎖定退出。
  • 輸入以 . 結束,模擬隱藏輸入 (未用 getch)。

2. 文件持久化

  • 二進制模式 "rb"/"wb"/"ab" 直接讀寫結構體數組。
  • Init() 啟動時載入 stopedcar.txt 到記憶體。
  • 取車後重寫整個文件 ("wb") 保證數據一致性。

3. 時間處理與計費


// 獲取當前時間字符串
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 返回靜態緩衝區,多線程不安全;本單線程程式無妨。

4. 車位管理邏輯


// 檢查車位是否被佔用
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;
}

5. 取車流程


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。

擴展方向

  1. 引入 SQLite 做持久化,支援並發、查詢。
  2. 用 ncurses 或 PDCurses 做 TUI 介面。
  3. 增加 VIP 月租、免費時段、優惠券等計費策略 (策略模式)。
  4. 網絡化:多出入口同步、雲端管理、微信/支付寶支付。
  5. 車牌識別 (OpenCV/商用 SDK) 自動錄入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved