1. Título
Um determinado estacionamento pode estacionar n carros, e o estacionamento tem apenas um portão. Cada carro que sai do estacionamento exige que o carro anterior saia do estacionamento para dar lugar a ele e, em seguida, os carros que deram lugar ao estacionamento novamente. O diagrama esquemático é o seguinte:
É necessário projetar um método de organização de dados razoável, projetar um algoritmo para realizar um sistema de gerenciamento de estacionamento, realizar a entrada e saída de veículos e cobrar de acordo com o tempo de estacionamento.
Em segundo lugar, as renderizações
- Cinco carros entram no estacionamento com apenas três carros (assumindo que a capacidade do estacionamento seja 3)
- Verifique o status do estacionamento enquanto deixa um carro que sai da área de espera entrar
- Verifique o estado do estacionamento e deixe um carro sair da sala de espera e entrar
- Visualize os registros históricos de pagamento de estacionamento dos dois veículos que saíram do estacionamento
Três, análise
- Para esta pergunta, só precisamos usar a estrutura de dados de pilhas e filas para completar os requisitos. Como o estacionamento tem apenas um portão, podemos aproximar o estacionamento como uma pilha (capacidade 3) , O veículo que entrar primeiro deve abrir caminho para o carro de trás. Quando o estacionamento estiver cheio, podemos usar a fila para simular um pátio de espera. Assim que o estacionamento sair, os carros no quintal podem entrar. Neste momento, a área de espera segue a regra de chegar primeiro, por isso é muito adequado utilizar filas. Também calculamos o tempo de entrada e saída dos carros, e a seguir calculamos com o valor que definimos para obter o valor a pagar por cada carro Ao mesmo tempo, também adicionei uma função de visualizar registros históricos de estacionamento e limpar a tela. Visualizar registros históricos de estacionamento pode facilitar o administrador para verificar o veículo e evitar que as pessoas discordem da quantidade de estacionamento. A função de limpar a tela é principalmente para tornar a interface mais refrescante. , Quando a informação de saída é muito grande, você pode limpar a tela.
Quarto, o código
//XMUT ZRZ 2020.6.19
#include<iostream>
#include<queue>
#include<stack>
#include<time.h>
#include<ctime>
#include<windows.h>
#include <iomanip>
#define capacity 3
using namespace std;
typedef struct Car {
string License="";
double begin=0;
double end=0;
string begin_time;
string end_time;
int order_number=0;
double cost=0;
}Car;
struct cmp2 {
bool operator ()(Car& a, Car& b) {
return a.begin > b.begin;//最大值优先
}
};
int total = 0;//统计一共来过多少辆车
int money = 1;//一分钟一块钱
bool vis[200];
queue<Car> Waiting;
stack<Car> Parking;
priority_queue<Car,vector<Car>,cmp2> history;
string getTime()
{
time_t timep;
time(&timep);
char tmp[64];
strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", localtime(&timep));
return tmp;
}
void Wait(string license)
{
Car temp;
auto t = clock();
temp.License = license;
temp.begin = t;
temp.begin_time = getTime();
temp.order_number = ++total;
Waiting.push(temp);
cout << temp.License << "进入侯车道" << endl;
}
void Add(string license)
{
if (Parking.size()>=capacity)
{
Wait(license);
}
else
{
Car temp;
auto t = clock();
temp.License = license;
temp.begin= t;
temp.begin_time = getTime();
temp.order_number = ++total;
Parking.push(temp);
cout << temp.License << "进入车场,开始计时收费" << endl;
}
}
void Leave(string license)
{
stack<Car> temp;
int cnt = Parking.size();
while(!Parking.empty())
{
Car car=Parking.top();
Parking.pop();
if (car.License == license)
{
cout << car.License << "退出车场";
auto t = clock();
car.end = t;
car.end_time = getTime();
car.cost = (car.end - car.begin)/60000 * money;
cout << "花费停车金额:" << setprecision(2)<<car.cost << endl;
history.push(car);
break;
}
else
{
temp.push(car);
}
}
if (temp.size() == cnt)
{
cout << "没有找到相应车牌号的车" << endl;
while (!temp.empty())
{
Parking.push(temp.top());
temp.pop();
}
}
else
{
while(!temp.empty())
{
Parking.push(temp.top());
temp.pop();
}
if (!Waiting.empty())
{
Car car = Waiting.front();
Waiting.pop();
Add(car.License);
}
}
}
void Check()
{
if (!Parking.empty())
{
cout << "当前在停车场的车为:" << endl;
stack<Car> temp = Parking;
while (!temp.empty())
{
Car x = temp.top();
cout << "车牌号为:"<< x.License << " 进入停车场时间:" << x.begin_time << endl;
temp.pop();
}
}
else
{
cout << "当前停车场没有车" << endl;
}
if (!Waiting.empty())
{
cout << "当前在侯车场的车为:" << endl;
queue<Car> temp1 = Waiting;
while (!temp1.empty())
{
Car x = temp1.front();
cout <<"车牌号为:"<<x.License << " 进入候车场时间:" << x.begin_time << endl;
temp1.pop();
}
}
else
{
cout << "当前侯车场没有车" << endl;
}
}
void History_Check()
{
cout << "总共有" << history.size() << "辆车停过" << endl;
priority_queue<Car, vector<Car>, cmp2> temp = history;
int i = 1;
while (!temp.empty())
{
Car x = temp.top();
temp.pop();
cout <<"第"<<i++<<"辆车的车牌为:"<<x.License << " 停入时间为:" << x.begin_time << " 离开时间为:" << x.end_time << " 停车费为:" << setprecision(2) << x.cost << endl;
}
}
int main()
{
cout << "--------------------------欢迎使用停车管理系统--------------------------" << endl;
cout << "1.车辆进入 2.车辆离开 3.查看当前车场状态 4.查看车场历史记录 5.清屏" << endl;
while (1) {
int i;
cout << "请输入要执行的操作: ";
cin >> i;
switch (i)
{
case 1:
{
string in;
cout << "请输入进入车辆车牌:";
cin >> in;
Add(in);
}
break;
case 2:
{
string out;
cout << "请输入离开车辆车牌:";
cin >> out;
Leave(out);
}
break;
case 3:
{
Check();
break;
}
case 4:
{
memset(vis, false, sizeof(vis));
History_Check();
break;
}
case 5:
{
system("cls");
cout << "--------------------------欢迎使用停车管理系统--------------------------" << endl;
cout << "1.车辆进入 2.车辆离开 3.查看当前车场状态 4.查看车场历史记录 5.清屏" << endl;
}
break;
}
}
}