用C++设有一个可以停放n(n>=5)辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车 未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制模拟该停车场的管理的程序。
时间: 2024-03-24 15:39:46 浏览: 163
以下是一个简单的C++停车场管理程序,实现了上述要求:
```c++
#include <iostream>
#include <queue>
#include <ctime>
#include <cstdlib>
using namespace std;
// 车辆结构体
struct Car {
int id; // 车牌号
time_t enter_time; // 进入时间
time_t leave_time; // 离开时间
};
// 停车场类
class ParkingLot {
private:
int capacity; // 停车场容量
queue<Car> car_queue; // 停车场队列
queue<Car> waiting_queue; // 便道队列
public:
ParkingLot(int n) {
capacity = n;
}
// 车辆进入停车场
bool enter(Car car) {
if (car_queue.size() < capacity) {
car_queue.push(car);
cout << "车辆 " << car.id << " 进入停车场,停放在第 " << car_queue.size() << " 个位置。" << endl;
return true;
} else {
waiting_queue.push(car);
cout << "停车场已满,车辆 " << car.id << " 进入便道等待。" << endl;
return false;
}
}
// 车辆离开停车场
void leave(Car car) {
int n = car_queue.size();
for (int i = 0; i < n; i++) {
Car c = car_queue.front();
car_queue.pop();
if (c.id == car.id) {
time_t leave_time = time(NULL);
c.leave_time = leave_time;
cout << "车辆 " << car.id << " 离开停车场,停留时间为 " << (leave_time - c.enter_time) << " 秒,停车费用为 " << (leave_time - c.enter_time) * 2 << " 元。" << endl;
// 从便道上取出一辆车进入停车场
if (!waiting_queue.empty()) {
Car next_car = waiting_queue.front();
waiting_queue.pop();
enter(next_car);
}
// 将后面的车辆重新放入停车场
while (!car_queue.empty()) {
Car c = car_queue.front();
if (c.id != car.id) {
car_queue.pop();
enter(c);
} else {
break;
}
}
return;
} else {
car_queue.push(c);
}
}
cout << "车辆 " << car.id << " 不在停车场内。" << endl;
}
// 打印停车场信息
void print() {
cout << "停车场内共有 " << car_queue.size() << " 辆车,停车场容量为 " << capacity << "。" << endl;
cout << "停车场:";
int n = car_queue.size();
for (int i = 0; i < n; i++) {
Car c = car_queue.front();
car_queue.pop();
cout << c.id << " ";
car_queue.push(c);
}
cout << endl;
cout << "便道上共有 " << waiting_queue.size() << " 辆车。" << endl;
}
};
// 生成随机车牌号
int generate_id() {
static int id = 0;
id++;
return id;
}
int main() {
ParkingLot p(5); // 停车场容量为5
srand(time(NULL));
for (int i = 0; i < 10; i++) {
int id = generate_id();
Car car = { id, time(NULL), 0 };
if (!p.enter(car)) {
continue;
}
if (rand() % 2 == 0) {
p.leave(car);
}
p.print();
}
return 0;
}
```
程序中使用了STL中的队列来管理停车场内的车辆和便道上的车辆。每辆车进入停车场时,都会被分配一个唯一的停车位置,如果停车场已满,则进入便道等待。每辆车离开停车场时,需要计算停留时间并收取停车费用,同时根据便道上的车辆顺序选择一辆车进入停车场。程序中还模拟了车辆的进出和停留过程,并能够实时打印停车场的状态。
阅读全文