#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MaxSize 5 //定义队列的最大个数为5
int amount=0;//全局洗过车的总数
int sum_time=0;//全局洗过车的总的等待时间
typedef struct
{
int number;
int in_time;//车进来的时间,输入时间推进时间的前进
float ave_time;//车的等待时间=车洗车的时间-车到达的时间
int wash_time;//车出队列进去洗车的时间
}DataType;
typedef struct
{
DataType queue[5];
int rear;
int front;
int count;
}SeqCQueue;
void QueueInitiate(SeqCQueue *Q)
{
Q->rear=0;
Q->front=0;
Q->count=0;
}
int QueueNotEmpty(SeqCQueue *Q)
{
if(Q->count!=0)return 1;
else return 0;
}
int QueueAppend(SeqCQueue *Q,DataType x)
{
if(Q->count>0&&Q->rear==Q->front)
{
printf("对不起! --||||等待队列已满! 欢迎下次光临!\n\n\n\n");
return 0;
}
else
{
Q->queue[Q->rear]=x;
Q->rear=(Q->rear+1)%5;
Q->count++;
return 1;
}
}
DataType QueueDelete(SeqCQueue *Q,DataType d)
{
if(Q->count==0)
{
printf("队列中无等待车辆O!\n\n\n\n");
}
else
{
d=Q->queue[Q->front];
Q->front=(Q->front+1)%5;
Q->count--;
return d;
}
}
void avetime(SeqCQueue *Q)
{
int j,i;
float sum,ave;
j=Q->front;
sum=0;
for(i=0;i<Q->count;i++)
{
sum+=Q->queue[j].ave_time;
j=(j+1)%5;
}
//ave=sum/Q->count;
ave=(float)(sum+sum_time)/amount;
printf("\n车%d进入等待队列,当前等待队列中共有%d辆车,平均等待时间为%.2f分钟\n\n\n\n",Q->queue[(Q->rear+4)%5].number,Q->count,ave);
}
void main()
{
int recent=0,flag=0,washing=0;
DataType car,x,d;
SeqCQueue Q;
QueueInitiate(&Q);
Q.queue[Q.front].wash_time=0;
Q.queue[Q.front].ave_time=0;
Q.queue[Q.front].in_time=0;
while(flag==0)
{
printf("\n\n\t\t\t 欢迎大家来洗车*^O^*!");
printf("\n\t\t ☆★☆★☆★☆★☆★☆★☆★☆★\n\n");
printf("请输入你的车牌: ");
scanf("%d",&car.number);
printf("\n请输入你的到达时间: ");
scanf("%d",&car.in_time);
car.wash_time=car.in_time+10;
if(car.in_time<999)
{
//当一辆车到来的时候,将所有排在它前面已经洗过的车清空
while(QueueNotEmpty(&Q)&&Q.queue[Q.front].wash_time<=car.in_time)
{
recent=Q.queue[Q.front].wash_time;
d=QueueDelete(&Q,x);
sum_time=sum_time+d.ave_time;
/*if(Q.count==0)
washing=0;*/
}
//清空后,如果队列空
if(!QueueNotEmpty(&Q))
{
if(recent+10<car.in_time||car.number==1)
//如果这个时候没有车在洗就直接洗车,等待时间为0
{
printf("\n车%d可以直接开始洗车了!!。\n\n\n\n",car.number);
recent=car.in_time;
car.ave_time=0;
amount++;
//avetime(&Q);
}
else//有车在洗,进队列,排第一个
{
car.wash_time=recent+10;
car.ave_time=car.wash_time-car.in_time;
QueueAppend(&Q,car);
amount++;
//avetime(&Q);
}
}
else
//队列为满,则溢出处理
if(Q.count==5)printf("\n对不起! 等待队列已满!--|||请稍候再来!!!\n\n\n\n");
else
if(Q.queue[Q.front].wash_time>car.in_time)
{
car.wash_time=Q.queue[(Q.rear+4)%5].wash_time+10;
car.ave_time=car.wash_time-car.in_time;
QueueAppend(&Q,car);
amount++;
//avetime(&Q);
}
}
else
{
flag=1;
avetime(&Q);
}
}
}