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

C 語言實現停車場分時段計費系統(含跨晝夜邏輯)

     編輯:關於C

項目背景

某城市停車場收費規則較為複雜:

  • 白天 (07:00-21:00):小車首小時 2.5 元/15分,後續 3.75 元/15分;大車首小時 5 元/15分,後續 7.5 元/15分。不足 15 分鐘按 15 分鐘計。
  • 夜間 (21:00-07:00):小車 1 元/2小時,大車 2 元/2小時。不足 2 小時按 2 小時計。
  • 需正確處理跨晝夜時段(如 06:30 進場,07:15 出場)。

核心設計思路

  1. 時間解析與比較:將輸入的「YYYY MM DD HH MI」拆解為整型分量,編寫 `Compare`、`CheckHour`、`CheckDay`、`CheckMonth` 判斷時序合法性與跨越關係。
  2. 日期迭代統計:從入場時間向前推進,按「年→月→日→小時→分鐘」層級累加完整天數、白天整點數、夜間整點數、尾部分鐘數。利用 `GenerateMonth` 計算各月天數(含閏年)。
  3. 分段計費:根據車型、時段、時長分別調用 `StatisticsHourOfDay`、`StatisticsHourOfNight`、`StatisticsHourDayCost`、`StatisticsHourNightCost` 計算費用,首小時/首兩小時單價與後續單價分開處理。
  4. 邊界處理:白天不足 15 分鐘進位;夜間不足 2 小時進位;跨晝夜邊界精確到分鐘級切換單價。

關鍵代碼結構

// 常量定義
const int   Bigcar_rule   = 5;      // 大車白天首15分
const float Smallcar_rule = 2.5f;   // 小車白天首15分
const float Bigcar_att    = 7.5f;   // 大車白天後續15分
const float Smallcar_att  = 3.75f;  // 小車白天後續15分
const int   Bigcar_night  = 2;      // 大車夜間2小時
const int   Smallcar_night= 1;      // 小車夜間2小時
const int   Per_time      = 15;     // 白天計費粒度(分)

// 入口函數
int StatisticsTime(int sy, int sm, int sd, int sh, int smi,
                   int ey, int em, int ed, int eh, int emi,
                   int car_type) {
    // 迭代累加 sumday, sumhour_day, sumhour_night, summinute
    // 呼叫 StatisticsCost 計算並輸出總費用
}

// 主程序交互
int main() {
    int sy, sm, sd, sh, smi, car_type;
    int ey, em, ed, eh, emi;
    printf("請輸入進場時間 (YYYY MM DD HH MI): ");
    scanf("%d %d %d %d %d", &sy, &sm, &sd, &sh, &smi);
    printf("車型 (1小車 2大車): ");
    scanf("%d", &car_type);
    printf("請輸入出場時間 (YYYY MM DD HH MI): ");
    scanf("%d %d %d %d %d", &ey, &em, &ed, &eh, &emi);

    if (Compare(sy,sm,sd,sh,smi, ey,em,ed,eh,emi)) {
        StatisticsTime(sy,sm,sd,sh,smi, ey,em,ed,eh,emi, car_type);
    } else {
        printf("輸入時間邏輯錯誤\\n");
    }
    return 0;
}

難點解析:跨晝夜邏輯

在 `StatisticsTime` 的主循環中,每次推進一個計費粒度(白天 15分、夜間 2小時),需動態判斷當前時刻屬於哪個時段:

if (sh >= 21 || sh < 7) {  // 夜間
    sumhour_night += StatisticsHour();  // 推進 2 小時
    sh += 2;
    if (sh >= 7 && sh < 9) { sh = 7; smi = 0; }  // 修正到白天起點
} else {  // 白天
    sumhour_day += StatisticsHour();    // 推進 1 小時
    sh++;
    if (sh >= 21) smi = 0;              // 修正到夜間起點
}
// 處理日期進位...

此邏輯確保在 07:00 和 21:00 邊界自動切換計費模式,並正確處理跨日、跨月、跨年場景。

擴展建議

  • 引入 `` 將字符串解析為 `struct tm`,用 `mktime` 轉 `time_t`,直接用秒數差計算總時長,再按時段切片計費,代碼更簡潔健壯。
  • 增加車輛類型擴展(新能源優惠、月租車等)。
  • 持久化記錄:將每筆進出場寫入文件/數據庫,支持查詢統計。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved