设有一个可以停放n(n>=5)辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车 未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制模拟该停车场的管理的程序。
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define MAXSIZE 2 //定义停车场的最大容量
#define MAX 10 //定义便道的最大容量
#define OK 1
#define ERROR 0
//建立车辆停留时间结点
float parktime;//车辆停留的总时间,全局变量
char panduan[10];//用于判断条件
struct shijian
{
int hour;
int minute;
};
//建立车辆信息的结点结构
typedef struct node
{
char num[10];//牌照信息
int panduan; //如果是1,表示到达,0表示离去
struct shijian arrivetime;
struct shijian leavetime;
}cardata;
//建立存放停车场车辆的栈
//临时栈和实际停车场站可建立一个栈数组
typedef struct
{
cardata elem[MAXSIZE];
int top;
}carstack;
void initstack(carstack* s)
{
s->top = -1;
}
int isempty(carstack* s)//判断空
{
return(s->top == -1 ? OK : ERROR);
}
int isfull(carstack* s)
{
return(s->top == MAXSIZE - 1 ? OK : ERROR);
}
int push(carstack* s, cardata x)
{
if (!isfull(s)) //站满不执行
{
s->top++;
s->elem[s->top] = x;
return OK;
}
else
return ERROR;
}
int pop(carstack* s, cardata* x)
{
if (!isempty(s))
{
*x = s->elem[s->top];
s->top--;
return OK;
}
else
return ERROR;
}
//构建计算停车场收费函数
float charge(cardata* x)//传入需要计算停车费的车辆信息,返回停车的总费用
{
int first;//停车起始费用
int h;//从第二个小时开始,每小时收取的费用
float last;//总费用
float t;//用于计算时间差,单位为hour
printf("请输入起始费用:\n");
scanf("%d", &first);
printf("请输入每小时收取的费用:\n");
scanf("%d", &h);
t = abs(x->leavetime.hour - x->arrivetime.hour) + abs(x->leavetime.minute - x->arrivetime.minute) / 60.0;
parktime=t;
if (t <= 1)
{
return first;
}
else
{
last = first + h * (t - 1.0);
return last;
}
}
//利用队列建立便道
typedef struct
{
cardata queue[MAX];
int front,rear;
}carqueue;
void initqueue(carqueue* sq)//队列的初始化
{
sq->front=sq->rear=0;
}
int queueempty(carqueue* sq)//判断队列是否为空
{
return(sq->front==sq->rear?OK:ERROR);
}
int queuefull(carqueue* sq)
{
return ((sq->rear+1)%MAX==sq->front? OK:ERROR);
}
//入队
int enterqueue(carqueue* sq,cardata x)
{
if(!queuefull(sq))
{
sq->rear++;
sq->queue[sq->rear]=x;
return OK;
}
else
{
printf("队列已满,无法入队\n");
return ERROR;
}
}
//出队
int deletequeue(carqueue* sq,cardata* x)
{
if(!queueempty(sq))
{
*x=sq->queue[sq->front];
sq->front++;
return OK;
}
else
{
return ERROR;
}
}
int main()
{
cardata mycar;//创建一个输入车的变量
carstack park;//建立一个停车场
carstack tempark;//建立一个临时停车场
carqueue way; //建立一个通道
int f;//便道的第几个位置
initstack(&park);
initstack(&tempark);
initqueue(&way);
printf("亲爱的顾客:\n");
printf("\t\t欢迎使用停车场管理系统\t\t\n");
do
{
printf("请输入您是到达还是离去:(到达按1,离去按0)\n");
scanf("%d",&mycar.panduan);
if(mycar.panduan==1)//表示到达
{
printf("请输入您的车牌号(例如苏A12345)\n");
scanf("%s",&mycar.num);
printf("请输入您到达的时间(小时+分钟):\n");
scanf("%d %d",&mycar.arrivetime.hour,&mycar.arrivetime.minute);
if(!isfull(&park)) //如果停车场不满
{
push(&park,mycar);//将车开入
printf("您的车目前停在%d车位(一共%d个车位)\n",park.top+1,MAXSIZE);
}
else //如果停车场已满,则将车存入便道
{
if(!queuefull(&way))//如果便道不满
{
enterqueue(&way,mycar);
f++;
printf("您的车目前停在便道的第%d个位置(便道一共有%d个位置)\n",f,MAX);
}
else
printf("此停车场已经超载,无法继续停车,请稍后再来\n");
}
}
else//表示离开
{
int i,j,k;
if(!isempty(&park)) //停车场有车的情况下
{
printf("请输入您的车停在停车场的第几号位:\n");
scanf("%d",&i);
printf("请输入现在的时间(小时+分钟)\n");
scanf("%d %d",&park.elem[i-1].leavetime.hour,&park.elem[i-1].leavetime.minute);
printf("您的车辆所需要支付的费用为:%0.2f元\n",charge(&park.elem[i-1]));
printf("您在停车场内停留的时间为%0.2f小时",parktime);
j=park.top;
cardata t;//中间变量
cardata s;
for(j;j>i-1;j--)//出的车辆后面的车辆出栈,表示让路
{
pop(&park,&t);//让路的车出栈
push(&tempark,t);//放入临时停放栈
}
pop(&park,&s);//自己的车出栈,即删除
while(!isempty(&tempark)) //将临时栈的车出栈进入停车场
{
pop(&tempark,&t);
push(&park,t);
}
if(!queueempty(&way))
{
deletequeue(&way,&t);//将便道的第一辆车出队
f--;
push(&park,t);//进入停车场
}
}
else//停车场无车
{
printf("您的操作有误!停车场内无车...\n");
}
}
printf("以上进程执行完毕,是否重新执行,请键入y或n以回车键结束:\n");
scanf("%s",panduan);
}while(!strcmp(panduan,"y"));
return 0;
}
运行结果:
创作不易,感谢支持