一、实验内容:
汽车在停车场内按车辆到达时间的先后顺序依次由南向北排列(大门在最北端,最先到达的第一辆车停放在停车场的最南端),若停车场内已停满n 辆车,则后来的汽车只能在门外的便道(即候车场上)等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场,每辆停放在停车场的车在它离开停车场时必须按停留的时间长短交纳费用。如果停留在便道上的车辆未进入停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
二、 功能和原始数据
2.1 主要功能
1)车辆信息的录入
2)根据用户输入的车辆到达或离去的信息,系统输出:
若是到达,则输出汽车在停车场内或便道上的停车位置:
若是离去,则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上停留的时间不收费。)
3)可以查看停车场内或便道上车辆相关信息:停车位、车牌号、到达时间
2.2 原始数据
测试数据如下:
(停车场内) | 到达时间 (停车场内) | 离开时间 (停车场内) | 总停车时间(min) (停车场内) | 停车费用 (停车场内) |
闽D12340 | 8:00 | 11:00 | 180 | 360 |
闽D12341 | 8:12 | 11:26 | 194 | 388 |
闽D12342 | 8:45 | 11:42 | 177 | 354 |
闽D12343 | 9:26 | 12:20 | 174 | 348 |
闽D12344 | 9:56 | 13:32 | 216 | 432 |
到达车辆车牌号(便道上) | 到达时间 (便道上) | 离开时间 (便道上) | 总停车时间 (便道上) | 停车费用 (便道上) |
闽Q44540 | 10:20 | 14:10 | 230 | 460 |
闽Q44541 | 10:28 | 15:00 | 272 | 544 |
三、 程序总体设计
3.1 数据结构设计
#define MAX_PARKING_SPOTS 5 // 停车位上限
#define MAX_WAITING_QUEUE 10 // 便道车辆数上限
struct Car {
char licensePlate[10]; // 车牌号
int arrivalHour; // 到达小时
int arrivalMinute; // 到达分钟
int parkedMinutes; // 停放时间(分钟)
int cost; // 停车费用
};
struct ParkingLot {
struct Car parkingSpots[MAX_PARKING_SPOTS]; // 停车位数组
struct Car waitingQueue[MAX_WAITING_QUEUE]; // 便道上的车辆队列
int numCarsParked; // 停车位上停放的车辆数
int numCarsWaiting; // 便道上等待的车辆数
};
3.2 程序总体框架。
- 主函数main负责初始化停车场和便道,并进入主循环。
- 主循环中,根据用户输入的选择选项调用相应的函数进行处理。
- 函数包括:
- printMainMenu:显示主菜单。
- carArrival:处理车辆到达事件。
- carDeparture:处理车辆离去事件。
- printPark:显示停车场和便道上的车辆信息。
图3-1 《停车场管理系统》框架图
3.3 函数原型清单
void printMainMenu(); // 打印主菜单
void carArrival(struct ParkingLot* parkingLot); // 处理车辆到达
void carDeparture(struct ParkingLot* parkingLot); // 处理车辆离去
void printPark (struct ParkingLot* parkingLot); // 打印停车场信息
3.4 程序组织
图3-2 《停车场管理系统》程序菜单图
四、功能算法设计和调试
4.1 主要功能算法设计
总体算法设计思想:
1. 停车场管理系统的主要功能是处理车辆的到达和离去事件,以及显示停车场和便道上的车辆信息。
2. 当车辆到达时,首先检查停车场是否已满。如果停车场已满,则将车辆放置在便道上等候。否则,将车辆停放在停车场内。
3. 当车辆离去时,首先检查停车场内是否有车辆。如果没有车辆,则提示停车场内没有车辆。否则,根据输入的离去车辆的车牌号,计算该车辆的停留时间和应缴纳的费用。然后,更新离去车辆的停放时间和费用,并将其他车辆前移。如果有车辆在便道上等候,则将第一辆车开入停车场。
4. 可以随时显示停车场和便道上的车辆信息。
伪代码如下:
初始化停车场和便道
choice = 0
while choice ≠ 4 do
显示主菜单
读取用户输入的选择选项
根据选择选项执行相应的操作:
case 1:
处理车辆到达事件
break
case 2:
处理车辆离去事件
break
case 3:
显示停车场和便道上的车辆信息
break
case 4:
退出系统
break
default:
显示无效的选项提示
Break
部分函数框架:
4.1.1函数void printMainMenu()
函数声明:void printMainMenu();
函数功能:系统菜单,显示主界面
函数参数与返回值说明:无参数无返回值
伪代码:
printMainMenu():
打印 "**********************"
打印 "停车场管理系统"
打印 "1. 车辆到达"
打印 "2. 车辆离去"
打印 "3. 查看停车场信息"
打印 "4. 退出"
打印 "请选择操作:"
4.1.2函数:void carArrival(struct ParkingLot* parkingLot);
函数声明:void carArrival(struct ParkingLot* parkingLot);
函数功能:处理车辆到达的情况,将车辆停放在停车场内或便道上。
函数参数与返回值说明: parkingLot:指向结构体 ParkingLot 的指针,表示停车场的信息。
伪代码:
carArrival(parkingLot):
如果停车场内的车辆已满:
如果便道上的车辆已满:
打印 "便道已满,无法等候更多车辆。"
返回
创建一个新的车辆 newCar
输入新车辆的车牌号
输入新车辆的到达时间
设置新车辆的停放时间为0
设置新车辆的费用为0
将新车辆停放在便道上
便道上等待的车辆数加一
打印 "车辆已停放在便道上等候。"
否则:
创建一个新的车辆 newCar
输入新车辆的车牌号
输入新车辆的到达时间
设置新车辆的停放时间为0
设置新车辆的费用为0
将新车辆停放在停车场内
停车场上停放的车辆数加一
打印 "车辆已停放在停车场内。"
4.1.3 函数void carDeparture(struct ParkingLot* parkingLot);
函数声明:void carDeparture(struct ParkingLot* parkingLot);
函数功能:处理车辆离去的情况,计算停车时间和费用,并更新车辆信息。
函数参数与返回值说明: parkingLot:指向结构体 ParkingLot 的指针,表示停车场的信息。
伪代码:
carDeparture(parkingLot):
如果停车场内没有车辆:
打印 "停车场内没有车辆。"
返回
输入离去车辆的车牌号
遍历停车位:
如果找到离去车辆:
输入离去时间
计算停放时间和费用
更新离去车辆的停放时间和费用
移除离去车辆,并将其他车辆前移
如果有等候的车辆:
将第一辆等候车辆开入停车场
返回
打印 "未找到该车辆在停车场内。"
4.1.2 函数void printPark(struct ParkingLot* parkingLot);
函数声明:void printPark(struct ParkingLot* parkingLot);
函数功能:对文件的数据进行处理
函数参数与返回值说明: 无参数无返回值
伪代码:
printPark(parkingLot):
打印 "停车场内车辆信息:"
对于 i 从 0 到 parkingLot->numCarsParked - 1:
打印 "车牌号:X Y"
打印 "到达时间:HH:MM"
打印 "--------------------"
打印 "便道上车辆信息:"
对于 i 从 0 到
打印 "车牌号:X Y"
打印 "到达时间:HH:MM"
打印 "--------------------"
4.2 调试
接下来按照表格中的数据进行调试:
1.当停车场内没有车辆时,用户选择车辆离去:
图4-2.1《停车场管理系统》调试图1
2.第一辆车到达停车场:
图4-2.2《停车场管理系统》调试图2
3.此时如果选择一辆场内没有的车出场,会显示“未找到该车辆在停车场内”:
图4-2.3《停车场管理系统》调试图3
4.接下来将表格中的场内车辆依次加入停车场:
图4-2.4《停车场管理系统》调试图4
图4-2.5《停车场管理系统》调试图5
5.由于停车场已经满了,继续到达只会停留在便道上面:
图4-2.6《停车场管理系统》调试图6
图4-2.7《停车场管理系统》调试图7
6.继续将表格中的便道测试值加入:
图4-2.8《停车场管理系统》调试图8
7.此时让第一辆车离去,程序计算停车费,并将便道上的第一辆车加入停车场
图4-2.9《停车场管理系统》调试图9
再将第二辆车离去,便道上的第二辆车会加入停车场:
图4-2.10《停车场管理系统》调试图10
8.以此重复“2”操作,将车辆离去,计算车费:
图4-2.11《停车场管理系统》调试图11
图4-2.12《停车场管理系统》调试图12
9、用户选择“4”,程序退出:
图4-2.13《停车场管理系统》调试图13
五、课程设计总结
我首先仔细阅读了课程设计的任务书,确保我对问题的需求和要求有清晰的理解。这帮助我明确了整个项目的目标和范围。根据题目要求,我开始思考如何设计算法来实现各个功能。
对于停车场问题:我实现了一个停车场管理系统,满足了汽车按到达时间顺序停放和离开的要求。系统中包括停车场和候车场,车辆按照先后顺序排列。首先根据问题描述,明确了停车场管理系统的需求和功能。根据题目要求,我选择了适当的数据结构来表示停车场和候车场,例如使用队列来模拟车辆的进出顺序。
在设计算法时,考虑了车辆进入停车场和离开停车场的情况。当有新车辆到达时,我首先检查停车场是否已满。如果停车场未满,则将车辆停放在停车场的最北端;如果停车场已满,则将车辆排队在候车场的末尾。当有车辆离开时,我将该车辆从停车场中移出,并根据停留时间计算停车费用。然后,我检查候车场中是否有等待的车辆,如果有,则允许第一辆车进入停车场。