1. 课题名称
停车场车位与车辆调度系统的设计与实现
2. 课题背景
随着城市机动车数量不断增加,停车场管理问题越来越常见。传统人工管理方式效率较低,容易出现车位分配不合理、车辆等待时间过长、信息记录不完整等问题。为了提高停车场管理效率,有必要设计一个能够完成车辆进出管理、车位分配、等待调度和记录查询的简易系统。
本课题以停车场管理为实际应用场景,使用 C 语言和数据结构基础知识实现一个命令行停车场车位与车辆调度系统。该系统不依赖数据库和 Web 技术,重点体现数组、结构体、队列等知识在实际问题中的应用,适合作为数据结构课程设计题目。
3. 设计目标
本系统的主要目标如下:
- 实现车辆进场登记与车位分配
- 实现停车场满载情况下的车辆排队等待
- 实现车辆离场处理及费用计算
- 实现空闲车位释放后的自动调度
- 实现停车区、等待区和历史记录的查询
- 通过项目实践加深对数据结构与 C 语言程序设计的理解
4. 需求分析
4.1 功能需求
系统应具备以下功能:
- 车辆进场
- 车辆离场
- 查看停车区车辆信息
- 查看等待队列信息
- 查看历史记录
- 查看车位统计信息
- 退出系统
4.2 业务规则
- 停车场车位数量固定
- 当停车场有空位时,车辆可直接进入并分配车位
- 当停车场已满时,后续车辆进入等待队列
- 当有车辆离场时,若等待队列非空,则队头车辆自动进入停车场
- 停车费用按停车时长计算
- 车辆信息和历史记录在程序运行期间保存在内存中
4.3 输入输出需求
输入内容主要包括:
- 菜单编号
- 车牌号
- 进场时间
- 离场时间
输出内容主要包括:
- 车位分配结果
- 等待队列状态
- 离场车辆费用信息
- 当前停车场统计信息
- 历史停车记录
5. 可行性分析
5.1 技术可行性
本系统只使用 C 语言完成,所用知识均为课程阶段已学习内容,包括:
- 结构体
- 数组
- 循环队列
- 函数设计
- 模块化编程
实现难度适中,技术上完全可行。
5.2 经济可行性
本系统作为课程设计项目,不需要额外硬件设备或商业软件支持,仅需普通编译环境即可运行,因此成本低。
5.3 操作可行性
系统采用菜单方式交互,输入输出直观,操作简单,适合演示与测试。
6. 总体设计
6.1 系统结构
系统采用模块化设计,主要由以下模块组成:
main.cparking.c/parking.hqueue.c/queue.hvehicle.c/vehicle.hrecord.c/record.hutils.c/utils.h
各模块功能如下:
main模块负责菜单显示和主流程控制parking模块负责车位管理和停车区操作queue模块负责等待车辆的排队调度vehicle模块负责车辆信息初始化与显示record模块负责历史记录保存与查看utils模块负责时间和费用等通用处理
6.2 系统流程
系统总体流程如下:
- 初始化停车区、等待队列和历史记录表
- 显示主菜单
- 根据用户输入执行相应功能
- 若选择退出,则结束程序
- 否则返回主菜单继续执行
7. 数据结构设计
7.1 车辆信息结构体
车辆信息使用 Vehicle 结构体表示,主要字段如下:
plate_number:车牌号enter_time:进场时间exit_time:离场时间duration:停车时长space_id:车位编号fee:停车费用
该结构体是系统中最核心的数据对象,用于停车区、等待队列和历史记录之间的数据传递。
7.2 停车区结构
停车区使用结构体数组实现,每个车位使用 ParkingSpace 结构体表示,包含:
id:车位编号occupied:是否被占用vehicle:当前停放车辆信息
整个停车场使用 ParkingLot 结构体表示,包含:
spaces[MAX_SPACES]:车位数组capacity:停车场容量occupied_count:已占用车位数
这种设计本质上属于顺序存储结构,便于通过下标直接访问车位信息。
7.3 等待队列结构
等待车辆使用循环队列实现,其结构为:
data[MAX_WAITING]:等待车辆数组front:队头下标rear:队尾下标size:当前队列长度
队列满足先进先出原则,符合“先到先等、先等先入场”的业务需求。
7.4 历史记录结构
历史记录使用顺序表形式实现,即使用数组保存所有离场车辆信息,结构中包含:
records[MAX_RECORDS]:历史记录数组count:当前记录数
这种实现方式简单直观,适合课程设计规模的数据管理。
8. 详细设计
8.1 主菜单设计
系统主菜单包括以下选项:
- 车辆进场
- 车辆离场
- 查看停车区车辆
- 查看等待队列
- 查看历史记录
- 查看车位统计
- 退出系统
程序在 main 函数中通过 do...while 循环持续显示菜单,直到用户输入 0 退出。
8.2 车辆进场设计
车辆进场处理流程如下:
- 输入车牌号
- 输入进场时间
- 初始化车辆结构体
- 调用
park_vehicle判断停车区是否有空位 - 若有空位则分配车位
- 若无空位则调用
enqueue_vehicle加入等待队列
该功能体现了顺序表查找空闲位置和队列入队操作。
8.3 车辆离场设计
车辆离场处理流程如下:
- 输入离场车辆车牌号
- 在停车区查找该车辆
- 若未找到,则提示错误
- 若找到,则输入离场时间
- 计算停车时长
- 计算停车费用
- 将离场车辆写入历史记录
- 释放车位
- 若等待队列非空,则调度队头车辆进入停车场
该部分是整个系统的核心逻辑,体现了多个数据结构之间的协作。
8.4 停车区查询设计
停车区查询功能遍历车位数组:
- 已占用车位显示车牌号
- 未占用车位显示空闲状态
该功能能够直观反映当前停车场状态。
8.5 等待队列查询设计
等待队列查询功能从队头开始遍历循环队列,依次输出等待车辆信息,用于显示排队情况。
8.6 历史记录查询设计
历史记录查询功能遍历历史记录数组,输出每一辆已离场车辆的车牌号、车位号、进场时间、停车时长和费用信息。
8.7 统计功能设计
系统统计功能输出以下信息:
- 车位总数
- 已占用车位数
- 剩余车位数
- 等待车辆数
用于反映停车场当前运行情况。
9. 核心算法说明
9.1 车位分配算法
系统采用顺序扫描方式分配车位:
- 从第一个车位开始遍历
- 查找第一个未被占用的车位
- 将该车辆分配到该车位
- 更新车位状态和已占用计数
该算法实现简单,适合小规模停车场系统。
9.2 等待调度算法
系统采用先进先出调度策略:
- 当停车场满时,车辆进入等待队列尾部
- 当车位释放后,从队头取出一辆等待车辆
- 将其安排进入空闲车位
该算法保证等待顺序公平合理。
9.3 费用计算算法
系统当前使用简单计费规则:
- 停车时长为
exit_time - enter_time - 每小时收费 5 元
- 若计算结果小于等于 0,则默认收费 5 元
该算法实现简单,便于验证和演示。后续可以继续扩展为更复杂的收费策略。
10. 主要函数说明
10.1 init_parking_lot
功能:初始化停车场,包括车位编号、占用状态和容量信息。
10.2 park_vehicle
功能:将车辆停入停车场,若有空位则返回车位号,否则返回失败标志。
10.3 remove_vehicle
功能:根据车牌号将车辆从停车区移除,并返回车辆信息。
10.4 enqueue_vehicle
功能:将车辆加入等待队列。
10.5 dequeue_vehicle
功能:从等待队列取出队头车辆。
10.6 add_record
功能:将离场车辆写入历史记录表。
10.7 calculate_duration
功能:计算停车时长。
10.8 calculate_fee
功能:根据停车时长计算费用。
11. 测试设计
11.1 测试目标
验证系统各项基础功能是否能够正确运行,重点检查:
- 车辆进场功能是否正确
- 车位分配是否合理
- 等待队列是否符合先进先出
- 离场后费用计算是否正确
- 历史记录是否成功保存
11.2 测试用例
测试用例 1:车辆正常进场
- 输入一辆新车牌号和进场时间
- 预期结果:车辆进入停车场并获得车位编号
测试用例 2:停车场满后进入等待队列
- 连续输入超过车位容量的车辆
- 预期结果:超出容量的车辆进入等待队列
测试用例 3:车辆正常离场
- 输入已在停车场中的车辆车牌号和离场时间
- 预期结果:车辆成功离场,显示停车时长和费用
测试用例 4:等待车辆自动调度
- 在停车场满且等待队列非空时,有车辆离场
- 预期结果:等待队列中的第一辆车自动进入停车场
测试用例 5:查询功能测试
- 分别查看停车区、等待队列、历史记录和统计信息
- 预期结果:输出内容与当前系统状态一致
12. 运行环境与运行方法
12.1 运行环境
- 操作系统:Linux、macOS 或 Windows
- 编译器:GCC
12.2 编译命令
1 | gcc main.c parking.c queue.c vehicle.c record.c utils.c -o parking |
12.3 运行命令
1 | ./parking |
13. 系统特点与不足
13.1 系统特点
- 采用 C 语言实现,结构清晰
- 数据结构应用明确,符合课程设计要求
- 功能完整,能够完成基本停车场管理流程
- 模块划分清楚,便于后续维护和扩展
13.2 系统不足
- 当前数据只保存在内存中,程序退出后不会自动持久化
- 时间输入仅按整数小时处理,精度较低
- 未实现按车牌模糊查询、修改记录等扩展功能
- 未加入异常输入处理和更复杂的收费模型
14. 改进方向
后续可以从以下方向继续完善:
- 增加文件存储功能,实现数据持久化
- 增加车牌查询和车辆修改功能
- 优化收费策略
- 增加不同类型车位管理
- 增加图形界面或可视化界面
15. 课程设计总结
通过本次课程设计,完成了一个基于 C 语言和基础数据结构的停车场车位与车辆调度系统。系统实现了车辆进场、离场、等待调度、历史记录查询和车位统计等主要功能,将抽象的数据结构知识与具体业务问题结合起来。
在实现过程中,加深了对结构体、数组、循环队列、模块化编程等知识的理解,也提高了分析问题、拆分模块和组织程序的能力。该项目具有较强的实践性和教学意义,达到了课程设计的基本目标。