/*****************************************************************************
题目:电话客户服务模拟
问题描述
一个模拟时钟提供接听电话服务的时间(以分钟计),
然后这个时钟将循环地自增1(分钟),直到到达指定的
时间为止。在时钟的每个“时刻”,就会执行一次检查
来看看当前电话的服务是否已经完成,如果是,这个电
话从电话队列中删除,模拟服务将从队列中取出下一个
电话(如果有)继续开始。同时还需要执行一个检查来
判断是否有一个新的电话到达,如果有将其到达的时间
记录下来,并为其产生一个随机服务时间,这个服务时
间也被记录下来,然后将这个电话放入电话队列中,当
客户服务人员空闲时,按照先来先服务的方式处理这个
队列。当时钟到达指定时间时,不会再接听新电话,但
是服务将继续,直到队列中所有电话得到处理为止。
要求
程序需要处理的初始数据包括:客户服务人员的人数、
时间限制,电话到达的速率,平均服务时间。
程序产生的结果包括:处理的电话数,每个电话的平均
等待时间
*****************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define D (24*60*60)
#define H (60*60)
#define M (60)
typedef int QueueData;
typedef struct node
{
QueueData time_call,time_serve; //结点数据
struct node * next; //结点链指针
} QueueNode;
typedef struct LinkQueue
{
QueueNode *rear, *front;
} LinkQueue;
LinkQueue* InitQueue (void)
{
LinkQueue *Q=( LinkQueue * ) malloc( sizeof ( LinkQueue ) );
Q->rear=Q->front=NULL;
return Q;
}
int QueueEmpty ( LinkQueue *Q )
{
return Q->front == NULL;
}
int GetFront ( LinkQueue *Q, QueueData *time_call, QueueData *time_serve)
{
if ( QueueEmpty (Q) ) return 0;
(*time_call) = Q->front->time_call;
(*time_serve) = Q->front->time_serve;
return 1;
}
int EnQueue ( LinkQueue **Q, QueueData time_call,QueueData time_serve )
{
QueueNode *p = ( QueueNode * ) malloc( sizeof ( QueueNode ) );
p->time_call = time_call;
p->time_serve = time_serve;
p->next = NULL;
if ( (*Q)->front == NULL ) //空,创建第一个结点
(*Q)->front = (*Q)->rear = p;
else (*Q)->rear = (*Q)->rear->next = p;
return 1;
}
int DeQueue ( LinkQueue **Q, QueueData *time_call,QueueData *time_serve )
{
//删去队头结点,并返回队头元素的值
if ( QueueEmpty (*Q) ) return 0; //判队空
QueueNode *p = (*Q)->front;
(*time_call) = p->time_call; //保存队头的值
(*time_serve) = p->time_serve;
(*Q)->front = (*Q)->front->next; //新队头
if ((*Q)->front == NULL) (*Q)->rear = NULL;
free (p);
return 1;
}
int now_time(void)
{
time_t t1;
time(&t1);
long time=t1%D;
return time;
}
int cre_rand(int t)
{
int tmp;
srand((int)time(0));
tmp=1+(int)(t*1.0*rand()/(RAND_MAX+1.0));
tmp-=t/2;
return tmp;
}
int main()
{
int i,
empty=0, //空闲客服数
num_serve, //客服人数
time_limit, //时间限制
tel_speed, //电话速率
tel_speed_tmp, //电话速率计时
time_avg_serve, //平均服务时间
time_wait_count, //总等待时间
count_tel, //处理电话数
num_serve_left, //等待接听客服数
time_now; //当前时间
time_limit=20;
count_tel=0;
time_wait_count=0;
int count[100];
QueueData time_call,time_serve;
LinkQueue *Q;
Q=InitQueue();
do
{
printf("input the num of server(>0)\n");
scanf("%d",&num_serve);
}while(num_serve<=0);
do
{
printf("input the limit of time(>0s)\n");
scanf("%d",&time_limit);
}while(time_limit<=0);
do
{
printf("input the speed of tel(>0s)\n");
scanf("%d",&tel_speed);
}while(tel_speed<=0);
do
{
printf("input the avg time of sreve(>0s)\n");
scanf("%d",&time_avg_serve);
}while(time_avg_serve<=0);
tel_speed_tmp=tel_speed;
num_serve_left=num_serve;
for(i=0;i<num_serve;i++)
{
count[i]=0;
}
system("clear");
while(time_limit)
{
printf("time_limit:%d\n",time_limit);
printf("num_serve_left=%d\t",num_serve_left);
for(i=0;i<num_serve;i++)
{
if(count[i]>0)
{
count[i]--;
if(count[i]==0)
{
num_serve_left++;
}
}
printf("ser_left[%d]=%d\t",i,count[i]); //
}
printf("\n");
if(tel_speed_tmp==0)
{
time_now=now_time();
EnQueue(&Q,time_now,(time_avg_serve+cre_rand(time_avg_serve)));
tel_speed_tmp=tel_speed-1;
}
else
{
tel_speed_tmp--;
}
while(num_serve_left) //客服空闲
{
if(!QueueEmpty(Q)) //等待队列未空
{
DeQueue(&Q,&time_call,&time_serve); //对头出队,接通客服
count_tel++;
for(i=0;i<num_serve;i++)
{
if(count[i]==0)
{
count[i]=time_serve; //设置通话时间
num_serve_left--;
break;
}
}
time_now=now_time();
time_wait_count+=time_now-time_call;
}
else
{
break;
}
}
printf("the num of tel is:%d\n",count_tel);
sleep(1);
system("clear");
time_limit--;
}
printf("time is over!\n"); //时间限制到
while(1) //处理剩余电话
{
printf("num_serve_left=%d\t",num_serve_left);
for(i=0;i<num_serve;i++)
{
if(count[i]==0)
{
empty++;
if(!QueueEmpty(Q)) //处理等待电话
{
DeQueue(&Q,&time_call,&time_serve);
count_tel++;
time_now=now_time();
time_wait_count+=time_now-time_call;
count[i]=time_serve;
num_serve_left--;
}
}
if(count[i]>0)
{
count[i]--;
if(count[i]==0)
{
num_serve_left++;
empty++;
}
printf("ser_left[%d]=%d\t",i,count[i]); //
}
}
printf("\n");
if(empty==num_serve)
{
break;
}
empty=0;
printf("the num of tel is:%d\n",count_tel);
sleep(1);
system("clear");
}
printf("serve is over\n");
printf("the num of tel is:%d\n",count_tel);
printf("the avg time to wait:%d(s)\n",time_wait_count/count_tel);
return 0;
}
电话客户服务模拟
最新推荐文章于 2021-05-18 01:24:00 发布