设计内容
熟悉理解栈和队列的逻辑结构和存储结构,设计实现停车场管理的模拟系统,其主要内容如下:设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出,其模型如下图1所示。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆汽车停放在车场的最北端),若车场内已停满n辆车,那么后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆汽车要离开时,在它之后进入的车辆必须先退出停车场按顺序开入临时停放道为其让路,待其开出大门外后,再按原次序进入车场,每辆停放在停车场的汽车在它离开停车场时必须按其停留的时间长短缴纳费用(从进入停车场开始计费)。
界面:interface.h
#include<iostream>
#include<Windows.h>
using namespace std;
void realtime_status(waiting* w, parking* p) {
cout << endl << "\t****************************************" << endl;
cout << endl << "\t停车场实时状态:" << endl;
cout << endl << "\t停车场内车辆:" << p->top + 1 << endl;
cout << endl << "\t剩余车位:" << N - p->top - 1 << endl;
cout << endl << "\t便道等待车辆:" << (w->rear - w->front + M) % M << endl;
cout << endl << "\t便道剩余位置:" << M - 1 - (w->rear - w->front + M) % M << endl;
cout << endl << endl << "\t1为请求进入停车场,2为请求离开停车场";
cout << endl << endl << "\t3为查看停车场内车辆,4为查看便道内车辆";
cout << endl << endl << "\t0为退出系统";
cout << endl << endl << "\t请输入您的请求:";
}
主程序:main.cpp
#include"park_function.h"
#include"interface.h"
using namespace std;
int main() {
//创建便道、停车场、临时停放区
waiting* w; parking* p; temp_parking* tp;
init_waiting(w);
init_parking(p);
init_temp_parking(tp);
//打印主界面
cout << endl << "\t欢迎进入停车场管理系统" << endl;
int tag = 99;
int num; //车牌号
int time; //停车时间
while (tag) {
realtime_status(w, p);
cin >> tag;
if (tag == 1) { //请求进入停车场
cout << endl << "\t请输入请求进入车辆的车牌号:";
cin >> num;
int flag = enter_parking(p, w, num);
if (flag == 1) {
cout << endl << "\t车辆进入停车场,开始计时" << endl;
continue;
}
else if (flag == 2) {
cout <<endl<< "\t车辆进入便道,等待停车位" << endl;
continue;
}
else {
cout <<endl<< "\t便道与停车场均饱和,请寻找其他停车场" << endl;
continue;
}
}
else if (tag == 2) { //请求离开停车场
cout << endl << "\t请输入离开车辆的车牌号:";
cin >> num;
if (mistake_handling(p, num, tag) == 0) {
cout << endl << endl << "\t输入错误,停车场内无该车" << endl;
continue;
}
int flag = leave_parking(p, w, tp, num, time);
if (flag == -1) {
cout << endl << "\t停车场内无车,请求错误" << endl;
continue;
}
else {
cout << endl << "\t车牌号:" << num << "\t停车时长:" << time << "\t收取费用:" << pay << endl;
continue;
}
}
else if (tag == 3) {
cout << endl << endl << "\t停车场内车辆情况:" << endl;
int t = check_parking(p);
if (!t) {
cout << "停车场内无车" << endl;
}
else if (t) {
cout << endl;
}
continue;
}
else if (tag == 4) {
check_waiting(w);
continue;
}
else if (tag == 0) {
break;
}
else {
cout << "\t请求功能不存在,请重新输入" << endl;
}
}
return 0;
}
功能实现:park_function.h
#include<iostream>
#include<ctime>
using namespace std;
const int N = 6; //停车场容量为6
const int M = 7; //使用环形队列,便道容量为6
const int L = 10; //临时停放区容量
int pay; //收取费用
typedef struct {
int num[N]; //车牌号
int time[N]; //停车时间
int top; //栈顶指针
}parking; //顺序栈模拟停车场
typedef struct {
int num[M]; //车牌号
int front, rear; //队头指针,队尾指针
}waiting; //环形队列模拟便道等待队列
typedef struct {
int num[L]; //临时停放的车的车牌号
int top; //栈顶指针
}temp_parking; //顺序栈模拟临时停放区
//初始化停车场顺序栈
void init_parking(parking*& p) {
p = new parking;
p->top = -1; //栈顶指针置初值
}
//初始化临时停放区顺序栈
void init_temp_parking(temp_parking*& tp) {
tp = new temp_parking;
tp->top = -1;
}
//初始化便道环形队列
void init_waiting(waiting*& w) {
w = new waiting;
w->front = w->rear = 0;
}
//关闭临时停放区
void close_temp_parking(temp_parking*& tp) {
delete tp;
}
//判断停车场是否为空
bool parking_empty(parking* p) {
return(p->top == -1);
}
//判断停车场是否已满
bool parking_full(parking* p) {
return(p->top == N - 1);
}
//判断便道是否为空
bool waiting_empty(waiting* w) {
return(w->front == w->rear);
}
//判断便道是否已满
bool waiting_full(waiting* w) {
return((w->rear + 1) % M == w->front);
}
//获取时间(用于计算费用)
int get_time() {
struct tm t; //tm结构指针
time_t now; //声明time_t类型变量
time(&now); //获取系统日期和时间
localtime_s(&t, &now); //获取当地日期和时间
int now_time = t.tm_hour * 60 + t.tm_min; //计算费用使用的时间
return now_time;
}
//显示时间
void show_time() {
struct tm t; //tm结构指针
time_t now; //声明time_t类型变量
time(&now); //获取系统日期和时间
localtime_s(&t, &now); //获取当地日期和时间
cout << endl << "\t现在时间:" << t.tm_hour << "时" << t.tm_min << "分" << endl;
}
//计费系统
int toll_system(int time1, int time2) {
int res = time2 - time1;
if (res <= 10) { //10分钟以内收费10
pay = 10;
return pay;
}
else if (res > 300) { //300分钟以上收费70
pay = 70;
return pay;
}
else if (res > 10 && res <= 300) { //10分钟以上300分钟以内每10分钟2块钱
res -= 10; pay = 10;
int temp = res % 10;
res /= 10;
pay += res * 2;
if (temp != 0) {
pay += 2;
}
return pay;
}
}
//车辆进入便道
int enter_waiting(waiting*& w, int num) {
if (waiting_full(w)) { //便道已满,拒绝申请
return 0;
}
w->rear = (w->rear + 1) % M;
w->num[w->rear] = num;
return 1;
}
//车辆离开便道
int leave_waiting(waiting*& w, int& num) {
if (waiting_empty(w)) { //便道为空,错误
return 0;
}
w->front = (w->front + 1) % M;
num = w->num[w->front];
return 1;
}
//车辆进入停车场
int enter_parking(parking*& p, waiting*& w, int num) {
if (parking_full(p)) { //停车场已满,在便道等待
if (enter_waiting(w, num)) { //可进入便道
return 2;
}
else { //便道已满
return 0;
}
}
//停车场有空位,让车进入停车场
p->top++;
p->num[p->top] = num; //记录进入的车辆的车牌号
p->time[p->top] = get_time(); //记录车辆的进入时间(该时间为用于计算费用的时间)
show_time(); //显示车辆进入的时间
return 1;
}
//车辆离开停车场
int leave_parking(parking*& p, waiting*& w, temp_parking*& tp, int& num, int& time) {
//num为需要离开的车的车牌,tp为临时停放区
if (parking_empty(p)) { //停车场为空,错误
return -1;
}
//停车场有车,让车离开停车场
init_temp_parking(tp);
cout << endl;
while (p->num[p->top] != num) { //移入临时停放区
tp->top++;
tp->num[tp->top] = p->num[p->top];
cout << "\t临时停放区有:" << tp->top + 1 << "辆车" << endl;
p->top--;
}
num = p->num[p->top]; //记录离开的车的车牌
show_time(); //显示当前时间
pay = toll_system(p->time[p->top],get_time()); //计算停车费
time = get_time() - p->time[p->top]; //累计停车时长
p->top--;
while (tp->top != -1) { //从临时停放区回到停车场
p->top++;
p->num[p->top] = tp->num[tp->top];
tp->top--;
}
close_temp_parking(tp);
if (!waiting_empty(w)) { //如果便道中有车,让其进入停车场
p->top++;
w->front = (w->front + 1) % M;
p->num[p->top] = w->num[w->front];
p->time[p->top] = get_time();
}
return pay; //收费
}
//查看停车场内车辆
int check_parking(parking*& p) {
int tag = p->top;
int flag = 0;
cout << endl << "\t";
while (p->top != -1) {
cout << p->num[p->top];
flag = 1;
if (p->top != 0) {
cout << " ";
}
p->top--;
}
p->top = tag;
if (flag) {
return 1;
}
else {
return 0;
}
}
//查看便道内车辆
void check_waiting(waiting* w) {
int i = w->front;
if (waiting_empty(w)) {
cout << endl << "\t便道为空" << endl;
return;
}
else {
cout << endl << endl << "\t便道内车辆:" << endl;
cout << endl << "\t";
while (i != w->rear) {
cout << w->num[i + 1];
if ((i + 1) != w->rear) {
cout << " ";
}
i = (i + 1) % M;
}
cout << endl;
}
}
//异常处理
int mistake_handling(parking* p, int num, int tag) {
if (tag == 2) {
int i = p->top;
while (i != -1) {
if (p->num[i] == num) {
return 1;
}
else {
i--;
}
}
return 0;
}
}