问题描述:
(1).停车场配置
一个停车场,拥有100个停车位。车辆停放在一条单行道上,而且只能从停车场的一侧进入,从一段离开。停车场另外提供一条过道,可供10辆汽车临时停靠。
车辆在进入停车场时,只能从一端进入,另外一端出去。若停车场内已经停满,则后来的车就只能停在门外的过道上等候。一旦停车场有空位,过道E上的第一辆车就可进入停车场,过道也是只有一段进入,另外一段出去。
(2).收费规则(关于收费规则及进出时间可按照个人需求改进代码)
每辆停在停车场的车,在离开停车场时,必须按照停留的时间长短缴纳费用。停车场按每小时2元计费,进出时间均为整数,不足一小时不收费。
(3).提供的功能
1.车辆入场
2.车辆离开
3.查看停车场
4.退出系统
代码如下:
Park.h
#include<iostream>
using namespace std;
struct Car {
char lisence_plate[10];//车牌
int time;//进入停车场的时间
};
//循环队列
typedef struct SqQueue {
Car*base;//数组
int front;//队头指针
int rear;//队尾指针
int size;//队列长度
}Queue;
int InitQueue(Queue&q, int nSize);//初始化队列
int DestoryQueue(Queue& q);//销毁队列
int QueueLength(Queue&q);//获得队列长度
int EnQueue(Queue&q, Car car);//向队尾插入元素
int DeQueue(Queue&q, Car&car);//从队首删除元素
int QueueTraverse(Queue q);//遍历队列中的元素并输出
Park.cpp
#include"Park.h"
//初始化队列
int InitQueue(Queue&q, int nSize) {
q.base = (Car*)malloc(nSize*sizeof(Car));
if (!q.base) {
cout << "初始化队列内存分配失败";
return -1;
}
q.front = q.rear = 0;
q.size = nSize;
return 0;
}
//销毁队列
int DestoryQueue(Queue& q) {
if (q.base) {
free(q.base);
q.base = NULL;
}
q.front = q.rear = 0;
q.size = 0;
return 0;
}
//返回当前队列中的元素个数
int QueueLength(Queue&q) {
return (q.rear - q.front + q.size) % q.size;
}
//往队列尾插入元素
int EnQueue(Queue&q, Car car) {
//判断队列是否满
if ((q.rear + 1) % q.size == q.front) {
return -1;
}
q.base[q.rear] = car;
q.rear = (q.rear + 1) % q.size;
return 0;
}
//从队列头删除元素
int DeQueue(Queue&q, Car&car) {
if (q.front == q.rear) {
cout << "该队列中已经没有车了"<<endl;
return -1;
}
car = q.base[q.front];
q.front = (q.front + 1) % q.size;
return 0;
}
//遍历队列中的序列并输出
int QueueTraverse(Queue q) {
if (q.front == q.rear) {
return -1;
}
int i = q.front;
while (i != q.rear) {
Car car;
car = q.base[i];
cout << "车牌号码:" << car.lisence_plate << "\t" << "入场时间为:" << car.time << endl;
i = (i + 1) % q.size;
}
return 0;
}
ParkCPro.cpp
#include "pch.h"
#include"Park.h"
#include<string>
#include <iostream>
using namespace std;
int Inpark(Queue&spPark, Queue&sqAisle) {
cout << "---------进入停车场---------"<<endl;
Car car;
cout << "请输入进入的车牌号"<<endl;
cin >> car.lisence_plate;
cout << "请输入进入车的时间:"<<endl;
cin >> car.time;
if (EnQueue(spPark, car) == 0) {
cout << "该车已进入停车场的第" << QueueLength(spPark) << "个位置" << endl;
}
else if (EnQueue(sqAisle, car) == 0) {
cout << "停车场车位已满,车停至临时车位第" << QueueLength(sqAisle) << "位置" << endl;
}
else {
cout << "停车场没有空余车位,请离开停车场"<<endl;
}
return 0;
}
//汽车出停车场
int OutPark(Queue&spPark, Queue&sqAisle) {
cout << "-----------离开停车场-----------"<<endl;
Car car;
int leatime;
cout << "请输入离场时间";
cin >> leatime;
if (DeQueue(spPark, car) == 0) {
cout << "该汽车在停车场一共呆的时间为" << leatime - car.time << "小时"<<endl;
cout << "停车费用为" << (leatime - car.time) * 2 << "元" << endl;
if (DeQueue(sqAisle, car) == 0) {
cout << car.lisence_plate << "从过道进入停车场" << endl;
cout << "请输入入场时间" << endl;
cin >> car.time;
EnQueue(spPark, car);
}
}
else {
cout << "没有车要离开" << endl;
}
return 0;
}
int ViewPark(Queue&spPark, Queue&sqAisle) {
cout << "--------查看停车场--------";
QueueTraverse(spPark);
QueueTraverse(sqAisle);
return 0;
}
int main()
{
Queue spPark;//声明停车场队列
Queue sqAisle;//声明临时车位序列
InitQueue(spPark, 100);
InitQueue(sqAisle, 10);
bool running = true;
while (running) {
cout << "-----------欢迎来到停车管理系统------------"<<endl;
cout << "1.车辆管理"<<endl;
cout << "2.车辆离开"<<endl;
cout << "3.查看停车场" << endl;
cout << "4.退出系统" << endl;
cout << "输入您想进行的操作序号:" << endl;
int a;
cin >> a;
switch (a) {
case 1:
Inpark(spPark, sqAisle);
break;
case 2:
OutPark(spPark, sqAisle);
break;
case 3:
ViewPark(spPark, sqAisle);
break;
case 4:
running = false;
cout << "再见"<<endl;
break;
}
}
//程序结束前,消除创建的两个队列
DestoryQueue(spPark);
DestoryQueue(sqAisle);
}
运行结果如下: