问题描述:
一个模拟时钟提供接听电话服务的时间(以分钟计),然后这个时钟将循环地自增1(分
钟)直到到达指定时间为止。在时钟的每个“时刻”,就会执行一次检查来看看当前电话的
服务是否已经完成了,如果是,这个电话从电话队列中删除,模拟服务将从队列中取出下一
个电话(如果有的话)继续开始。同时还需要执行一个检查来判断是否有一个新的电话到达。
如果是将其到达时间记录下来,并为其产出一个随机服务时间,这个服务时间也被记录下来,
然后这个电话被放入电话队列中,当客户服务人员空闲时,按照先来先服务的方式处理这个
队列。当时钟到达指定时间时,不会再接听新电话,但是服务将继续,直到队列中所有电话
都得到处理为止。
要求:
(1)程序需要的初始数据包括:客户服务人员的人数,时间限制,电话的到达速率,平均
服务时间。
(2)程序产生的结果包括:处理的电话数,每个电话的平均等待时间。
(3)输出模拟的序列或过程。
C语言编写,使用VS2008.
哎,一个这个作业,写了两天才搞出来,最后100多行代码实现了,感觉还可以。
以后要好好学习数据结构了,不想解释怎么写的,直接上源代码
源代码:
#include
#include
#include
#define NumServer 5
#define AverageServiceTime 3
#define MaxRunTime 15
typedef struct queue
{
int ReatchTime;//到达时间
int RandServiceTime;//随机服务时间段
int XuHao;//到来的序号
struct queue *next;
}Customer;
//初始化队列
Customer *front = NULL;
Customer *rear = NULL;
int Server[NumServer+1];//里面只有一个元素,判断是否空闲。0为空闲,大于0为繁忙
int main()
{
int ReatchSpeed;//每分钟到来的电话数
float SumWaitTime = 0.0;
int i;
int j;
int k;
int n;
int t;
int b = 1;
int count = 1;//电话序号
int NotOrYesCustomerIdle = 1;//“是否有任意的客服空闲”参数,-1表示没有,1表示有
for(n=0;n
ReatchTime = i;
TempCustomer->RandServiceTime = rand()%AverageServiceTime+1 ;//[1,AverageServiceTime ]之间的整型随机数
TempCustomer->XuHao = count;
front = TempCustomer;
rear = TempCustomer;
rear->next = NULL;
}
else
{
TempCustomer->ReatchTime = i;
TempCustomer->RandServiceTime = rand()%AverageServiceTime+1 ;//[1,AverageServiceTime ]之间的整型随机数
TempCustomer->XuHao = count;
rear->next = TempCustomer;
rear = TempCustomer;
rear->next = NULL;
}
count++;//每创建一个,序号+1
ReatchSpeed--;
}
}
else if(b==1)
{
printf("现在时间为%d,已到系统限制时间,不再接受新的电话到来,接下来只处理等待队列中的电话\n",i);
b = -1;
}
NotOrYesCustomerIdle = 1;//每一次i的循环,都视为有客服空闲,这样才能往下进行检查,
//下面while中NotOrYesCustomerIdle>0是循环几次的条件。而NotOrYesCustomerIdle = 1是为了让循环能够初始进行
//任务分配
if(front == NULL)
printf("等待电话接入. . .\n");
else
{
while( (front != NULL) && (NotOrYesCustomerIdle>0) )//非空才分配任务
{
NotOrYesCustomerIdle = -1;
for(j=0;j
XuHao,front->RandServiceTime); Server[j] = front->RandServiceTime; SumWaitTime = SumWaitTime + (i - front->ReatchTime); //数据处理完后,进行删除 //Customer *Temp = front; front = front->next; //free(Temp); } } } //置客服为空闲函数 for(k=0;k
0) Server[k]--; } if( (i>MaxRunTime) && (front == NULL) ) { printf("共接听%d个电话,所有电话的等待时间之和为%3.1f分钟,平均等待时间为%4.3f分钟\n\n",count-1,SumWaitTime,SumWaitTime/(count-1)); printf("电话客服模拟程序运行结束,感谢使用!\n\n"); break; } } return 0; }