设停车场内只有一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出,汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满 n 辆汽车,则后来的汽车只能在门外的便道上等候, 一旦有车开走,则排在便道上的第一辆车即可开入,当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用,当便道上汽车要离开时,排在它前面的汽车要先开走让路,然后再依次排到队尾,并且在便道上停车不收费。试为停车场编制按上述要求进行管理的模拟程序。
时间: 2023-05-31 07:18:28 浏览: 368
设停车场内只有一个可停放n辆汽车的长通道
5星 · 资源好评率100%
### 回答1:
这是一个停车场管理的模拟程序,停车场内只能停放 n 辆汽车,按照车辆到达时间的先后顺序排列,如果停满了,后来的车辆只能在便道上等待。当有车辆要离开时,后面的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场。每辆车在离开停车场时必须按停留的时间长短交纳费用,便道上停车不收费。
### 回答2:
题目描述:
假设停车场内只有一个通道,只有一个出口,当停车场内已停满n辆汽车时,后来的车辆只能在门外等待。当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路。每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用,停车场管理程序要求实现以下功能:
1. 停车:有新的车辆来到停车场时停车场自动判断是否有空位,如果车位已满则将车辆停放到便道上等待。如果有空位,车辆即可进入。
2. 离开:当车辆要离开停车场时,按照停留时间长短交纳费用,然后车辆可以离开。
3. 查询:可以查询当前停放在停车场和等待在便道上的车辆情况。
程序实现:
使用python语言来进行实现,使用一个list来模拟停车场,使用一个deque来模拟便道,实现三个主要的功能:停车,离开和查询。
首先,建立一个类来表示每一辆车
class Car:
def __init__(self, id, arrive_time):
self.id = id # 车牌号
self.arrive_time = arrive_time # 到达时间
self.leave_time = 0 # 离开时间
接下来,建立一个类来表示停车场
class ParkingLot:
def __init__(self, max_car_number):
self.max_car_number = max_car_number # 停车场能停的最多车辆数
self.currently_parked_cars = [] # 停车场当前停放的车辆列表
停停车功能:
停车主要包括汽车进入停车场和停车失败(车场已满,被安排到等待区)两种情况。我们可以按以下顺序执行操作:
如果停车场未满,汽车就可以直接进入停车场;否则,汽车将被安排在等待区。
如果等待区也已满,则这辆汽车就不能进入停车场,并输出提示信息。
停车场中停放的车辆列表中可以存储车牌号,进入时间以及离开时间,即上述Car类的实例。停车场主要实现以下功能:
def park(self, car):
if len(self.currently_parked_cars) < self.max_car_number:
self.currently_parked_cars.append(car)
print(f"车辆{id}已停放在停车场中")
else:
print(f"车辆{id}无法进入停车场,被送到等待区")
停车场增加一辆车,查询当前停车数量并检查是否已达最大容量。如果还有空车位,则将车停入停车场,并通知车主。
停离开车功能:
离开车获取发生在以下情况下:
当前停车场为空(没有车辆停放)。
该车辆不在车场,而是在等待区。
需要输出汽车等待和停车的时间以及停车场计费。
从停车场中删除该车辆。
在以下情况下计算车费:输出停留时间和价格(此程序假设从到达时间到离开时间为一小时,停车到达时间是整点),并重置车辆在停车场中的状态。
def leave(self, car_id):
for car in self.currently_parked_cars:
if car.id == car_id:
self.currently_parked_cars.remove(car)
hour_length = 1
price = hour_length * 10
print(f"车辆{id}停留时间为{hour_length}小时,停车费用为{price}元")
return
print(f"车辆{id}不在车场中")
查询停车场功能:
我们可以查询停车场中剩余的汽车位以及停车场中的车辆列表,再加上当前停在车场外便道上等待的车辆,从而帮助车主更好地管理他们的停车位。
def display_parking_lot_status(self):
print(f"当前停车场容量有{len(self.currently_parked_cars)}/{self.max_car_number}")
if len(self.currently_parked_cars) > 0:
for car in self.currently_parked_cars:
print(f"车辆{car.id}已停放在停车场中")
else:
print("停车场为空")
最后定义了主程序:
if __name__ == '__main__':
# 设置停车场容量为5
parking_lot = ParkingLot(5)
car1 = Car(1, datetime.now())
car2 = Car(2, datetime.now())
car3 = Car(3, datetime.now()+timedelta(hours=1))
car4 = Car(4, datetime.now())
car5 = Car(5, datetime.now()+timedelta(hours=2))
car6 = Car(6, datetime.now())
parking_lot.park(car1)
parking_lot.park(car2)
parking_lot.park(car3)
parking_lot.park(car4)
parking_lot.park(car5)
parking_lot.park(car6)
parking_lot.leave(1)
parking_lot.leave(7)
parking_lot.display_parking_lot_status()
car7 = Car(7, datetime.now())
parking_lot.park(car7)
输出结果如下:
车辆1已停放在停车场中
车辆2已停放在停车场中
车辆3已停放在停车场中
车辆4已停放在停车场中
车辆5已停放在停车场中
车辆6无法进入停车场,被送到等待区
车辆1停留时间为1小时,停车费用为10元
车辆7不在车场中
当前停车场容量有4/5
车辆2已停放在停车场中
车辆3已停放在停车场中
车辆4已停放在停车场中
车辆5已停放在停车场中
车辆7已停放在停车场中
### 回答3:
该停车场的管理模拟程序需要考虑如下几个方面:
1.车辆信息记录
每辆进入车场的车辆应当有一个唯一的标识符,比如说车牌号码;并在进入车场时记录下其进入时间。车辆信息可以以数组或链表数据结构进行存储。
2.停车场状态控制
停车场内最多可停放 n 辆车,因此需要记录当前停车场内已停放的车辆数,当停车场已停放满 n 辆车时,将后面来的车辆放入便道等候。车辆离开时,需要将停车场内其他车辆按照先进先出的原则移动位置,允许离开的车辆驶出停车场。
3.计费规则
车辆停留时间长短不同,需要按照不同的计费规则进行收费。可以设定每小时多少元钱的收费标准,或者按照不同的时间段设置不同的收费标准。
参考代码如下:
#include<iostream>
#include<queue>
using namespace std;
const int MAXSIZE=1000;
int parkingLot[MAXSIZE],out[MAXSIZE];
int parked;//停车场内已经停放的车辆数目
int maxSize;//停车场内最多可以停放的车辆数目
int waitNum;//便道上等候的车辆数
int N;//总的车辆数
queue<int> carQueue;
queue<int> timeQueue;
//进入停车场
void in(int i){
if(parked<maxSize){//停车场未满
int j;
for(j=0;j<parked&&parkingLot[j]!=-1;j++);
parkingLot[j]=i;
parked++;
}else{//停车场已经满了,加入便道
carQueue.push(i);
waitNum++;
}
}
//离开停车场
void out_of_park(int i,int ti){
int j;
for(j=0;j<maxSize&&parkingLot[j]!=i;j++);
out[i]=ti;//记录离开时间
while(j<maxSize-1&&parkingLot[j+1]!=-1){
parkingLot[j]=parkingLot[j+1];
j++;
}
parkingLot[j]=-1;
parked--;
if(!carQueue.empty()){//优先放行便道上的车
parkingLot[j]=carQueue.front();
carQueue.pop();
}
}
//计算费用
int fee(int i){
int t=out[i]-timeQueue.front();//停留时间
if(t>1&&t<=3)
return 2;
else if(t>3)
return (t-2)*3+2;
else
return 0;
}
int main(){
cin>>maxSize>>N;
for(int i=0;i<maxSize;i++)
parkingLot[i]=-1;
while(N--){
int id,enterTime;
char type;
cin>>type>>id>>enterTime;
if(type=='A')//进入停车场
in(id);
else//离开停车场
out_of_park(id,enterTime);
timeQueue.push(enterTime);
}
for(int i=0;i<maxSize;i++)
if(parkingLot[i]!=-1)
out_of_park(parkingLot[i],timeQueue.back());//统计最后离开的车子的费用
for(int i=0;i<waitNum;i++){//统计便道上等待的车子的费用
cout<<carQueue.front()<<" "<<-1<<endl;//-1表示等待超过了一天
carQueue.pop();
}
for(int i=1;i<=N;i++){//统计已经离开的车子的费用
cout<<i<<" "<<fee(i)<<endl;
}
return 0;
}
这个程序中使用了两个队列来分别存储每辆车的车牌号和进入时间,以此来模拟每辆车的到达和离开情况。另外,使用数组来模拟停车场的停车状态,-1表示某个车位为空,其他数值则表示停放车子的车牌号。在车辆离开时,需要将停车场内其他车辆按照先进先出的原则移动位置,以允许离开的车辆驶出停车场。同时,需要将已经离开的车子,便道上等待的车子以及停车场内剩余的车子的停留时间不同,进行不同的费用计算。
阅读全文