本文是程设计——《停车场管理系统》课题的一个分享。使用了顺序表和栈的数据结构,这也是数据结构与算法课设专栏的第六篇博客,我觉得不应当只是提供要求与原代码,还应当提供一些说明和思维导图的引导。如果您还有别的建议和想法,欢迎评论和私信。
目录
1.设计内容与要求
设计内容: 设有一个可以停放n(n>=5)辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制模拟该停车场的管理的程序。 设计要求: (1) 符合课题要求,实现相应功能; (2) 要求界面友好美观,操作方便易行; (3) 注意程序的实用性、安全性; |
2.程序总体设计
(1).数据结构设计
typedef struct car {
char licen[50]; // 车牌号
time_t startTime ; // 到达时间
time_t endTime ; // 离开时间
double time = 0.0 ; // 停放时间(秒)
double cost = 0.0; // 停车费用
}Car;
typedef struct ParkingLot {
Car Spots[n]; // 停车位数组
Car Queue[m]; // 便道上的车辆队列
int num_Parked = 0; // 停车位上停放的车辆数 //当做指针使用
int num_Waiting = 0; // 便道上等待的车辆数
}ParkingLot;
程序使用的数据结构有两个,一个是顺序栈Sports(栈最大长度已知,所以使用顺序栈),另一个是一个不完全的队列Queue,除了支持队列的基本功能,还支持队内元素自由弹出。二者和各自的指针num_Parked和num_waiting封装在结构体ParkingLot中。
(2).程序总体框架
1.计时功能实现
如果使用时车辆进入和离开停车场的时间都要靠键盘输入的话,实际使用太过繁琐。所以,提出一个新的想法。当车辆进入停车场时,通过使用time函数记录车辆进入停车场的时刻startTime。当车辆离开停车场时,再记录一下车辆离开的时刻endtTme。这样就可以去计算出车辆在停车场的停留时间并记录到time中。这样不仅避免了多次输入的繁琐,还跟贴近实际生活。
time_t startTime = time(NULL);
Sleep(5000);
time_t endTime = time(NULL);
double timeDiff = difftime(endTime, startTime); //计时原理
printf("费用:%3.1f", (timeDiff) * poice);
课题中还提到,停车场的大门尽允许一辆车通行,当停车场内部的车要离开时,靠近外面的车都要先离开车场腾开位置。这段等待的时间就不能计入车辆的停车时间中,等待时间的计算其实很简单。
(这其实只是我们规则假设的一种情况,方便我们去计算等候时间,按照实际情况,不可能所有车移动和等候的时间是规则的,如果想更贴近这种情况,可以去定义一个函数:当车辆离开停车场时,记录当前时刻并将该车辆的标记值设为1(默认为0)等车辆回到停车场时再记录时刻,去计算等待时间。我们在系统中可以使用输入1来表示让一辆车离开,输入0表示一辆车进入。当然,这也只是模拟的一个过程,本次程序并没有实现这个功能,欢迎有实现了该功能的同学在评论区分享交流)
2.车辆停入与离开流程实现
(3).函数原型清单
void Pop_sports();
void Pop_queue();
void Push_sports();
void Push_queue();
void Pop();
void Push();
void p_money();
void Menu();
void Menuport();
3.系统运行结果与调试
运行时为了方便观察,设置的停车场可停放车辆为2,使用时建议更改到符合要求的>=5
开始运行,打印菜单,进行选择。
开始进行停入操作,三张分别是停入停车场,停入车道,无法停入的操作显示 。
执行车辆驶离操作,让第一个停入的车离开并结算停车费,发现能够正常运行和计算。(后续输入时间在120秒,停留时间是正确的)
让车道上的车辆也驶离一辆。
这时候,再进行显示操作,不仅发现驶离的车辆已经不再显示,车道中的第一辆车也已经进入了停车场中。说明我们的功能是正常实现的。
4.代码实现
变量声明
#define n 5
#define m 5
#define length_1 13
#define length_2 18
#define poice 5 //系统实际安排应该是一小时的费用 这里为了方便演示 以一秒钟5元计入
typedef struct car {
char licen[50]; // 车牌号
time_t startTime ; // 到达时间
time_t endTime ; // 离开时间
double time = 0.0 ; // 停放时间(秒)
double cost = 0.0; // 停车费用
}Car;
typedef struct ParkingLot {
Car Spots[n]; // 停车位数组
Car Queue[m]; // 便道上的车辆队列
int num_Parked = 0; // 停车位上停放的车辆数 //应该可以当做指针使用
int num_Waiting = 0; // 便道上等待的车辆数
}ParkingLot;
ParkingLot Park;