首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >附完整源码 | C语言实现停车管理系统

附完整源码 | C语言实现停车管理系统

作者头像
C语言中文社区
发布2025-07-04 10:21:39
发布2025-07-04 10:21:39
19800
代码可运行
举报
文章被收录于专栏:C语言中文社区C语言中文社区
运行总次数:0
代码可运行

C语言中文社区源码git仓库:https://gitee.com/cyyzwsq/C-Coding.git

正文

停车管理系统设计

1. 系统概述

本停车管理系统是一个基于C语言的命令行应用程序,用于管理停车场的车辆进出、计费和状态监控。系统支持车辆进入、车辆离开、查看停车场状态和查看车辆信息等功能。

2. 系统架构

系统采用模块化设计,主要包含以下模块:

  1. 数据结构模块:定义车辆和停车场的数据结构
  2. 初始化模块:初始化停车场系统
  3. 车辆管理模块:处理车辆进出
  4. 计费模块:计算停车费用
  5. 状态显示模块:显示停车场和车辆信息
  6. 用户界面模块:提供菜单和交互界面

3. 数据结构设计

3.1 车辆结构体 (Car)
代码语言:javascript
代码运行次数:0
运行
复制
typedef struct {
    char license_plate[20];  // 车牌号
    time_t entry_time;       // 入场时间
    int spot_number;         // 停车位号
    int is_parked;           // 是否已停车(1:是,0:否)
} Car;
  • license_plate: 存储车辆车牌号
  • entry_time: 记录车辆入场时间,用于计算停车时长
  • spot_number: 记录车辆停放的停车位号
  • is_parked: 标记车辆是否在停车场内
3.2 停车场结构体 (ParkingSystem)
代码语言:javascript
代码运行次数:0
运行
复制
typedef struct {
    int total_spots;         // 总停车位数量
    int available_spots;     // 可用停车位数量
    Car cars[MAX_CARS];      // 车辆数组
    int parking_spots[MAX_SPOTS]; // 停车位状态(0:空,1:占用)
} ParkingSystem;
  • total_spots: 停车场总停车位数量
  • available_spots: 当前可用停车位数量
  • cars: 存储所有车辆信息的数组
  • parking_spots: 停车位状态数组,0表示空,1表示占用

4. 功能模块设计

4.1 初始化系统 (initialize_system)
  • 功能:初始化停车场系统
  • 参数:停车场指针,总停车位数量
  • 处理流程:
    1. 设置总停车位数量和可用停车位数量
    2. 初始化所有停车位为空
    3. 初始化所有车辆为未停车状态
4.2 车辆进入 (car_enter)
  • 功能:处理车辆进入停车场
  • 处理流程:
    1. 输入车牌号
    2. 检查车牌号是否已存在
    3. 查找可用停车位
    4. 记录车辆信息(车牌号、入场时间、停车位号)
    5. 更新停车位状态
4.3 车辆离开 (car_leave)
  • 功能:处理车辆离开停车场
  • 处理流程:
    1. 输入车牌号
    2. 查找车辆记录
    3. 计算停车费用
    4. 更新停车位状态
    5. 显示停车时间和费用
4.4 计算停车费用 (calculate_fee)
  • 功能:根据停车时间计算费用
  • 计费规则:
    • 基础费率:每小时5元
    • 连续停车超过24小时的部分享受8折优惠
  • 处理流程:
    1. 计算停车总小时数(向上取整)
    2. 判断是否超过24小时
    3. 根据费率计算总费用
4.5 显示停车场状态 (display_parking_status)
  • 功能:显示停车场当前状态
  • 显示内容:
    • 总停车位数量
    • 可用停车位数量
    • 已占用停车位数量
    • 每个停车位的状态(空/占用)
4.6 显示车辆信息 (display_car_info)
  • 功能:显示停车场内所有车辆信息
  • 显示内容:
    • 车牌号
    • 停车位号
    • 入场时间
    • 已停车时间
    • 当前应付费用

5. 用户界面设计

系统采用简单的文本菜单界面,主要功能包括:

  1. 车辆进入
  2. 车辆离开
  3. 查看停车场状态
  4. 查看车辆信息
  5. 退出系统

6. 系统限制

  1. 最大支持100个停车位和100辆车的记录
  2. 车牌号长度限制为20个字符
  3. 费率固定为每小时5元
  4. 连续停车折扣率为8折

7. 扩展性考虑

  1. 可以通过修改宏定义来调整最大车辆数和停车位数
  2. 费率和折扣率可以通过配置文件或用户输入来动态设置
  3. 可以添加数据库支持以持久化存储数据
  4. 可以扩展为图形用户界面

8. 使用说明

  1. 编译并运行程序
  2. 根据菜单提示选择操作
  3. 输入相应信息完成操作
  4. 选择5退出系统

9. 测试用例

  1. 车辆进入测试
    • 输入车牌号,验证是否成功停入可用停车位
    • 尝试重复车牌号,验证是否提示已存在
    • 当停车场满时,验证是否提示停车场已满
  2. 车辆离开测试
    • 输入有效车牌号,验证是否正确计算费用
    • 输入无效车牌号,验证是否提示未找到
    • 验证停车位状态是否正确更新
  3. 计费测试
    • 停车1小时,验证费用是否为5元
    • 停车25小时,验证是否应用折扣
    • 停车部分小时,验证是否向上取整
  4. 状态显示测试
    • 验证显示的停车位数量是否正确
    • 验证显示的车辆信息是否准确

10.测试结果

代码语言:javascript
代码运行次数:0
运行
复制
D:\CODING\cyyzwsq\ParkingMS\cmake-build-debug\ParkingMS.exe

=== 停车场管理系统 ===
1. 车辆进入
2. 车辆离开
3. 查看停车场状态
4. 查看车辆信息
5. 退出系统
请选择操作(1-5):1


请输入车牌号:陕A12345

车辆 陕A12345 已停入 1 号停车位

=== 停车场管理系统 ===
1. 车辆进入
2. 车辆离开
3. 查看停车场状态
4. 查看车辆信息
5. 退出系统
请选择操作(1-5):3


=== 停车场状态 ===
总停车位: 100
可用停车位: 99
已占用停车位: 1

停车位占用情况:
停车位 1: 已占用
停车位 2: 空
停车位 3: 空
...省略
停车位 98: 空
停车位 99: 空
停车位 100: 空

=== 停车场管理系统 ===
1. 车辆进入
2. 车辆离开
3. 查看停车场状态
4. 查看车辆信息
5. 退出系统
请选择操作(1-5):4


=== 停车场内车辆信息 ===
车牌号: 陕A12345
停车位: 1
入场时间: Thu Jul 03 21:51:31 2025
已停车: 0.01 小时
当前费用: 5.00 元
-----------------

=== 停车场管理系统 ===
1. 车辆进入
2. 车辆离开
3. 查看停车场状态
4. 查看车辆信息
5. 退出系统
请选择操作(1-5):2


请输入车牌号:陕A12345

车辆 陕A12345 从 1 号停车位离开
停车时间: 0.02 小时
应付费用: 5.00 元

=== 停车场管理系统 ===
1. 车辆进入
2. 车辆离开
3. 查看停车场状态
4. 查看车辆信息
5. 退出系统
请选择操作(1-5):

完整源码

源码已经上传至git仓库:https://gitee.com/cyyzwsq/C-Coding.git

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tgmath.h>
#include <time.h>

#define MAX_SPOTS 100      // 最大停车位数量
#define MAX_CARS 100       // 最大车辆数量
#define PARKING_FEE 5      // 每小时停车费(元)
#define DISCOUNT_RATE 0.8  // 连续停车折扣率

// 车辆结构体
typedef struct {
    char license_plate[20];  // 车牌号
    time_t entry_time;       // 入场时间
    int spot_number;         // 停车位号
    int is_parked;           // 是否已停车(1:是,0:否)
} Car;

// 停车场结构体
typedef struct {
    int total_spots;         // 总停车位数量
    int available_spots;     // 可用停车位数量
    Car cars[MAX_CARS];      // 车辆数组
    int parking_spots[MAX_SPOTS]; // 停车位状态(0:空,1:占用)
} ParkingSystem;

// 初始化停车场系统
void initialize_system(ParkingSystem *system, int total_spots) {
    system->total_spots = total_spots;
    system->available_spots = total_spots;

    // 初始化所有停车位为空
    for (int i = 0; i < total_spots; i++) {
        system->parking_spots[i] = 0;
    }

    // 初始化所有车辆为未停车状态
    for (int i = 0; i < MAX_CARS; i++) {
        system->cars[i].is_parked = 0;
    }
}

// 显示菜单
void display_menu() {
    printf("\n=== 停车场管理系统 ===\n");
    printf("1. 车辆进入\n");
    printf("2. 车辆离开\n");
    printf("3. 查看停车场状态\n");
    printf("4. 查看车辆信息\n");
    printf("5. 退出系统\n");
    printf("请选择操作(1-5): ");
}

// 查找可用停车位
int find_available_spot(ParkingSystem *system) {
    for (int i = 0; i < system->total_spots; i++) {
        if (system->parking_spots[i] == 0) {
            return i + 1; // 返回停车位号(从1开始)
        }
    }
    return -1; // 没有可用停车位
}

// 车辆进入停车场
void car_enter(ParkingSystem *system) {
    char license_plate[20];
    printf("\n请输入车牌号: ");
    scanf("%s", license_plate);

    // 检查车牌号是否已存在
    for (int i = 0; i < MAX_CARS; i++) {
        if (system->cars[i].is_parked &&
            strcmp(system->cars[i].license_plate, license_plate) == 0) {
            printf("该车辆已在停车场内!\n");
            return;
        }
    }

    // 查找可用停车位
    int spot = find_available_spot(system);
    if (spot == -1) {
        printf("停车场已满!\n");
        return;
    }

    // 查找第一个未使用的车辆记录
    int car_index = -1;
    for (int i = 0; i < MAX_CARS; i++) {
        if (!system->cars[i].is_parked) {
            car_index = i;
            break;
        }
    }

    if (car_index == -1) {
        printf("系统错误: 无法记录车辆信息!\n");
        return;
    }

    // 记录车辆信息
    strcpy(system->cars[car_index].license_plate, license_plate);
    system->cars[car_index].entry_time = time(NULL);
    system->cars[car_index].spot_number = spot;
    system->cars[car_index].is_parked = 1;

    // 更新停车位状态
    system->parking_spots[spot - 1] = 1;
    system->available_spots--;

    printf("车辆 %s 已停入 %d 号停车位\n", license_plate, spot);
}

// 计算停车费用
double calculate_fee(ParkingSystem *system, int car_index) {
    time_t now = time(NULL);
    double hours = difftime(now, system->cars[car_index].entry_time) / 3600.0;
    hours = ceil(hours); // 向上取整

    // 连续停车超过24小时享受折扣
    if (hours > 24) {
        int full_days = (int)(hours / 24);
        double remaining_hours = hours - (full_days * 24);
        return (full_days * 24 * PARKING_FEE * DISCOUNT_RATE) +
               (remaining_hours * PARKING_FEE);
    }

    return hours * PARKING_FEE;
}

// 车辆离开停车场
void car_leave(ParkingSystem *system) {
    char license_plate[20];
    printf("\n请输入车牌号: ");
    scanf("%s", license_plate);

    // 查找车辆
    int car_index = -1;
    for (int i = 0; i < MAX_CARS; i++) {
        if (system->cars[i].is_parked &&
            strcmp(system->cars[i].license_plate, license_plate) == 0) {
            car_index = i;
            break;
        }
    }

    if (car_index == -1) {
        printf("未找到该车辆!\n");
        return;
    }

    // 计算费用
    double fee = calculate_fee(system, car_index);

    // 更新停车位状态
    int spot = system->cars[car_index].spot_number;
    system->parking_spots[spot - 1] = 0;
    system->available_spots++;
    system->cars[car_index].is_parked = 0;

    printf("车辆 %s 从 %d 号停车位离开\n",
           license_plate, spot);
    printf("停车时间: %.2f 小时\n",
           difftime(time(NULL), system->cars[car_index].entry_time) / 3600.0);
    printf("应付费用: %.2f 元\n", fee);
}

// 显示停车场状态
void display_parking_status(ParkingSystem *system) {
    printf("\n=== 停车场状态 ===\n");
    printf("总停车位: %d\n", system->total_spots);
    printf("可用停车位: %d\n", system->available_spots);
    printf("已占用停车位: %d\n", system->total_spots - system->available_spots);

    printf("\n停车位占用情况:\n");
    for (int i = 0; i < system->total_spots; i++) {
        printf("停车位 %d: %s\n", i + 1,
               system->parking_spots[i] ? "已占用" : "空");
    }
}

// 显示车辆信息
void display_car_info(ParkingSystem *system) {
    printf("\n=== 停车场内车辆信息 ===\n");
    int count = 0;

    for (int i = 0; i < MAX_CARS; i++) {
        if (system->cars[i].is_parked) {
            printf("车牌号: %s\n", system->cars[i].license_plate);
            printf("停车位: %d\n", system->cars[i].spot_number);

            time_t entry_time = system->cars[i].entry_time;
            printf("入场时间: %s", ctime(&entry_time));

            double hours = difftime(time(NULL), entry_time) / 3600.0;
            printf("已停车: %.2f 小时\n", hours);

            printf("当前费用: %.2f 元\n",
                   calculate_fee(system, i));
            printf("-----------------\n");
            count++;
        }
    }

    if (count == 0) {
        printf("停车场内没有车辆\n");
    }
}

// 主函数
int main() {
    ParkingSystem system;
    int choice;

    // 初始化系统,设置100个停车位
    initialize_system(&system, MAX_SPOTS);

    do {
        display_menu();
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                car_enter(&system);
                break;
            case 2:
                car_leave(&system);
                break;
            case 3:
                display_parking_status(&system);
                break;
            case 4:
                display_car_info(&system);
                break;
            case 5:
                printf("感谢使用停车场管理系统!\n");
                break;
            default:
                printf("无效选择,请重新输入!\n");
        }
    } while (choice != 5);

    return 0;
}

本停车管理系统提供了基本的停车场管理功能,可以根据实际需求进一步扩展和完善。

创作不易,麻烦点赞

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正文
    • 停车管理系统设计
      • 1. 系统概述
      • 2. 系统架构
      • 3. 数据结构设计
      • 4. 功能模块设计
      • 5. 用户界面设计
      • 6. 系统限制
      • 7. 扩展性考虑
      • 8. 使用说明
      • 9. 测试用例
      • 10.测试结果
      • 完整源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档